Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++;_C++ - Fatal编程技术网

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};