C++ 初始值设定项列表和常量&;-这是合法的C++;
考虑:C++ 初始值设定项列表和常量&;-这是合法的C++;,c++,C++,考虑: #include <iostream> #include <vector> class A { public: const int& i; }; class B { public: const std::vector<int>& i; }; int main() { A a = { 3 }; std::cout << a.i << std::endl; B
#include <iostream>
#include <vector>
class A
{
public:
const int& i;
};
class B
{
public:
const std::vector<int>& i;
};
int main()
{
A a = { 3 };
std::cout << a.i << std::endl;
B b = { { 1, 2 } };
std::cout << b.i[0] << " " << b.i[1] << std::endl;
}
#包括
#包括
甲级
{
公众:
const int&i;
};
B类
{
公众:
常数std::向量&i;
};
int main()
{
A A={3};
std::cout第一个是OK,临时对象的生存期在分配给引用时会延长。第二个是UB AFAIK,因为{{1,2}
是一个std::initializer\u list
,而不是直接的std::vector
。延长生存期的临时对象是不可传递的(也就是说,它一直持续到当前函数的末尾,在本例中是构造函数),只有本地函数被延长。它在gcc上意外工作,因为这肯定是未定义的行为
为了满足B
的初始化,编译器需要构造一个临时向量
。由于对该向量的引用是const
,因此编译器认为使用它初始化B
没有问题。但是,一旦初始化结束,临时对象就变得无效,因此在初始化之外通过引用访问它是未定义的行为。这显然是未定义的行为。您有绑定到临时对象的引用,这些临时对象不久就会被销毁。“似乎有效”是UB的一种可能的表现形式。我不认为这是的重复。这个问题涉及构造函数调用,但这是关于聚合初始化的。标准草案实际上有一个类似的:struct S{int mi;const std::pair&mp;};S a{1,{2,3};
。