jjzjj

c++ - 将非类非数组纯右值转换为 cv 限定类型是否合法?

我正在阅读valuecategories,并遇到以下内容(为简洁起见省略了很多):Thefollowingexpressionsareprvalueexpressions:aliteral(exceptforstringliteral),suchas42,trueornullptr;Properties:Anon-classnon-arrayprvaluecannotbecv-qualified.但是...下面的程序可以正常编译和运行onideone.com和g++5.4.0:#includeintmain(){std::cout我知道编译器提供扩展,并且可以在遇到未定义行为时执行各种

c++ - 为什么覆盖虚函数时不考虑访问限定符?

以下代码打印“I'mB!”。这有点奇怪,因为B::foo()是私有(private)的。关于A*ptr,我们可以说它的静态类型是A(foo是public),它的动态类型是B(foo是私有(private)的)。所以我可以通过指向A的指针调用foo。但是这样我就可以访问B中的私有(private)函数。可以算作封装违规吗?由于访问限定符不是类方法签名的一部分,因此会导致这种奇怪的情况。为什么在覆盖虚函数时不考虑C++中的访问限定符?我可以禁止这种情况吗?这个决定背后的设计原则是什么?Liveexample.#includeclassA{public:virtualvoidfoo(){st

C++ Boost 属性树通过属性限定符更新现有节点

好的,下面是XML结构的示例:actualvalueactualvalue我希望能够做两件事:直接获取测试A元素,而不必循环所有忽略元素......就像属性上的选择器一样。如果不出意外,我需要一种方法来更新任一忽略元素,但似乎无法弄清楚我是否必须删除该元素并重新创建它?我似乎无法想出一种方法来执行通过属性(在该级别是唯一的)限定元素(在同一级别有许多相同名称的元素)的put。类似于:pt.put("config.Ignored.Ignore..name='TestA'.Criteria.value",some_var)或者任何其他可以实现最终目标的东西。非常感谢!全面披露:我是C++的

c++ - 当非限定名称查找涉及 using-directives 时 [basic.scope.hiding]p2 的解释

在c++中有两种隐藏的名字:1)普通名称隐藏:[basic.scope.hiding]p1(http://eel.is/c++draft/basic.scope.hiding#1):Anamecanbehiddenbyanexplicitdeclarationofthatsamenameinanesteddeclarativeregionorderivedclass([class.member.lookup]).2)隐藏在[basic.scope.hiding]p2(http://eel.is/c++draft/basic.scope.hiding#2)中的特殊名称类型:Aclassn

c++ - 是基类型的有符号/无符号部分还是限定符

Wikipage声称C++中的限定符是const和volatile。Thisanswer告诉unsigned、unsigned和short等也是限定符。虽然问题确实提到了它是关于C的,但Wikipage在C方面也没有说明。对于C,限定符是const、volatile、restrict和_Atomic。StackOverflow的qualifier标签的扩展消息框说Aqualifieraddsanextra"quality",suchasspecifyingvolatilityorconstnessofavariable“Addanextraquality”,从引文来看,singed/u

c++ - type_info 不考虑 cv 限定符 : is this right?

这段代码打印1是正确的行为还是g++4.5的怪癖?#include#includeusingnamespacestd;intmain(){structA{};cout我认为cv限定符的不同类型作为非常不同的类型受到威胁,即使较少的cv限定类型可以隐式转换为更多cv限定的类型。 最佳答案 typeid根据C++标准(摘自ISO/IEC14882:2003的§5.2.8)忽略cv限定符:Thetop-levelcv-qualifiersofthelvalueexpressionorthetype-idthatistheoperandof

c++ - 限定名称的使用无效

我正在尝试以下操作:#includenamespaceA{externintj;}intmain(){intA::j=5;std::cout但我遇到了错误:无效使用限定名称‘A::j’。请解释为什么会出现这个错误? 最佳答案 Pleaseexplainwhythiserroroccurred?该语言根本不允许您在函数内定义namespace范围的变量。定义必须在namespaceA中:namespaceA{intj=5;}或在周围(全局)命名空间中:intA::j=5;当然,您可以在函数内部为变量赋值:intmain(){A::j=

c++ - 引用限定符和删除的成员方法

考虑以下代码:#includestructS{voidf(int)=delete;voidf(int)&&{}};intmain(){}它不会编译说成员方法不能重载,当然这是有道理的。另一方面,编译以下代码:#includestructS{voidf(int)&=delete;voidf(int)&&{}};intmain(){Ss;//s.f(42);这是合法的代码吗?难道不能在同一个类中定义两个完全不同的接口(interface),前者与左值一起使用,后者与右值一起使用吗?除了没有多大意义,但它确实让我很受伤。一个被删除的函数不应该作为一个整体被删除,而不是只有当你是左值时才被删除

c++ - 向成员函数添加 const 限定符

我目前正在编写一个接口(interface)类,它应该提供对复杂结构的内部元素作为常量或非常量引用的访问。这个想法是一些模块被授予const访问权限,而一些模块被授予完全访问权限。我已经使用'type_traits''std::add_const'来有条件地限定内部成员函数的返回类型,不幸的是我想不出有条件地将成员函数限定为const或非const的方法。这可能吗?如果是这样怎么办?例如:templatestructapply_const{typedefTtype;};templatestructapply_const{typedeftypenamestd::add_const::ty

c++ - 类成员限定名称查找

考虑以下代码片段:classA{intb[A::a];//1,errorvoidfoo(){intb=A::a;}//2,okstaticconstinta=5;}条款3.4.3.1/1(限定名称查找,类成员)说:Ifthenested-name-specifierofaqualified-idnominatesaclass,thenamespecifiedafterthenested-name-specifierislookedupinthescopeoftheclass(10.2)这意味着将查找//1和//2中嵌套名称说明符之后的名称a在类范围内。条款10.2(成员名称查找)说:1