Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C&x2B第12.1.14段的基本原理是什么+;标准_C++_Language Lawyer - Fatal编程技术网

C++ C&x2B第12.1.14段的基本原理是什么+;标准

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; 要真正理解这个理由,你需要与委员会的成员进行沟通,或者至少阅

这是来自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;

要真正理解这个理由,你需要与委员会的成员进行沟通,或者至少阅读相关的讨论。我帮不了你

这在上下文中的作用是对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’;
}