C++ C&x2B第12.1.14段的基本原理是什么+;标准
这是来自C++11的 在构建C++ C&x2B第12.1.14段的基本原理是什么+;标准,c++,language-lawyer,C++,Language Lawyer,这是来自C++11的 在构建常量对象期间,如果访问了对象或其任何子对象的值 通过不是直接或间接从构造函数的this指针获取的glvalue,值 未指定由此获得的对象或子对象的名称。[示例: structc; 无效无选择(C*); 结构C{ INTC; C():C(0){no_opt(this);} }; 常数C-cobj; 无效无选项(C*cptr){ int i=cobj.c*100;//未指定cobj.c的值 cptr->c=1; 要真正理解这个理由,你需要与委员会的成员进行沟通,或者至少阅
常量
对象期间,如果访问了对象或其任何子对象的值
通过不是直接或间接从构造函数的this指针获取的glvalue,值
未指定由此获得的对象或子对象的名称。[示例:
structc;
无效无选择(C*);
结构C{
INTC;
C():C(0){no_opt(this);}
};
常数C-cobj;
无效无选项(C*cptr){
int i=cobj.c*100;//未指定cobj.c的值
cptr->c=1;
要真正理解这个理由,你需要与委员会的成员进行沟通,或者至少阅读相关的讨论。我帮不了你
这在上下文中的作用是对const对象的构造施加比一般情况下更严格的限制。通常适用的规则在S12.7中有一定的篇幅,它们主要关注对象的生存期。例如,它们不禁止别名
对常量对象的限制将允许实现者采用更积极的优化策略。例如,对象可能在转换时构造,或者通过将其从循环中提升只构造一次,或者完全优化。由于常量对象不会改变,编译器通常不必担心别名,但(如示例代码所示)在这种特殊情况下,它们会
我忍不住想,一定有这样一种情况,即该规则可以防止其他外部可见的违反const要求的行为。给出的示例不是这种情况,而且我还没有找到。也许其他参与者可以提供帮助。猜测:因为这消除了对象必须存在的要求。换句话说s、 通过这种方式,编译器可以自由地优化到内联const
对象的程度,而不会让它实际占用内存。这样做是不可能的,还可以为它提供一个有效的this
。还有一个优化可能在这里发挥作用:对(非可变)对象的多次访问const对象的成员总是产生相同的值,因此您只需读取一次。这至少解释了为什么第二次访问cobj.c
会产生一个未指定的值。
struct C;
void no_opt(C*);
struct C {
int c;
C() : c(0) { no_opt(this); }
};
const C cobj;
void no_opt(C* cptr) {
int i = cobj.c * 100; // value of cobj.c is unspecified
cptr->c = 1;
cout << cobj.c * 100 // value of cobj.c is unspecified
<< ’\n’;
}