C++ 常数引用数据成员

C++ 常数引用数据成员,c++,c++11,C++,C++11,假设我们有一个具有常量引用数据成员的结构 struct A { A() : i{5} {} const int& foo() const { return i; } const int& i; }; 你知道为什么整数文本5的输出不同吗 A a{}; std::cout << a.i << std::endl; std::cout << a.foo() << std::endl; 5 -858993460

假设我们有一个具有常量引用数据成员的结构

struct A {
    A() : i{5} {}
    const int& foo() const { return i; }
    const int& i;
};
你知道为什么整数文本5的输出不同吗

A a{};
std::cout << a.i << std::endl;
std::cout << a.foo() << std::endl;

5
-858993460
A{};

代码格式不正确。您正在从literal
5
初始化
i
,这需要构造一个临时对象,然后绑定到
i
。当构造函数退出时,临时文件将被销毁,然后
i
将被挂起,随后对它的任何取消引用都将导致UB,这意味着任何事情都是可能的

从标准上看,

绑定到中引用成员的临时表达式 mem初始值设定项格式不正确。[ 例如:

struct A {
  A() : v(42) { }   // error
  const int& v;
};
- 结束示例 ]


顺便说一句:由于标准声明它的格式不正确,编译器需要为它发出诊断。gcc的行为(给出警告)和clang(给出错误)都是符合标准的;如果VS2017没有发出任何诊断,那么它就不符合标准。

使用
常量
值而不是
文字

这是
Class::Class():成员{arg1,arg2,…}{…
c++11
以来的直接列表初始化

试试这个:

 struct A {
    const int t = 5;
    A() : i{ t } { }
    const int& foo() const { return i; }
    const int& i;
};

int main()
{
    A a{};
    std::cout << a.i << std::endl;
    std::cout << a.foo() << std::endl;

    return 0;
}
结构A{ 常数int t=5; A():i{t}{} 常量int&foo()常量{return i;} const int&i; }; int main() { A{};
std::我能得到一个答案吗。Clang实际上给出了一个错误。你是在问为什么这不正确,还是在知道程序不正确的情况下,特别是为什么两个输出不同?另请参阅。看起来你有一个未定义行为的案例。顺便说一句,VS 2017没有输出任何警告。我不明白为什么整数文本超出了o的范围仅当访问函数foo中的引用值时。@dubrava UB意味着一切皆有可能;因此您可能会得到
5
-858993460
、或
42
、或类似segfault的结果。我不是要存储临时文本,只是想知道它的作用域是类还是构造函数。@dubrava我改进了我的answer,请检查一下。但是关于你的问题,老实说,我没有使用c++11,但是我提供了这个答案来解决你的问题。顺便说一下,可能会对你有所帮助。如果我想将const引用初始化为默认值,我会在类中使用初始化器const int&i{5};好的,谢谢你的参考和详细解释!