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{};
代码格式不正确。您正在从literal5
初始化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};好的,谢谢你的参考和详细解释!