C++ 以下示例中给出的构造有什么不幸之处?

C++ 以下示例中给出的构造有什么不幸之处?,c++,constructor,reference,temporary-objects,C++,Constructor,Reference,Temporary Objects,第15.6.2节“初始化基础和构件”(N4713)有以下第11项示例: struct A { A() = default; // OK A(int v) : v(v) { } // OK const int& v = 42; // OK }; A a1; // error: ill-formed binding of temporary to reference A a2(1); // OK, unfortunately 示例最后一行中的结构有什么不幸之处 我搜

第15.6.2节“初始化基础和构件”(N4713)有以下第11项示例:

struct A {
    A() = default; // OK
    A(int v) : v(v) { } // OK
    const int& v = 42; // OK
};
A a1; // error: ill-formed binding of temporary to reference
A a2(1); // OK, unfortunately
示例最后一行中的结构有什么不幸之处

我搜索了整个参考文献,寻找其他被允许的“不幸”行为,但没有找到


如果在这种特殊情况下是不幸的,它是否会被定为非法

在这两种情况下,
A::v
都是悬空引用(临时从42开始,或构造函数的参数
v

在某些情况下,引用临时(即使使用寿命延长)可能是合法的,并且使用正确


很难检测到所有的误用情况以禁止它们。

通过“OK,不幸”实际上意味着“不正常,但编译器不需要警告”是的,它意味着“你不希望这种情况发生,如果它出错了会很好,但它不会/不能/什么的”最新草案的链接:我认为这并不违法,因为只要您只访问构造函数中的
v
成员,它就没有问题。(编写这样的代码是没有意义的,但是C++不只是因为程序没有意义而禁止程序)。不幸的是代码不正确,编译器不需要发出诊断。如果诊断会给编译器带来过多的工作量(静态分析)以发现冲突,或者不可能进行诊断,则通常不需要进行诊断。C++给程序员带来了很大的负担;C++不是保姆语言。如果我有什么困惑,什么使第一个声明不成立,为什么在第一种情况下它是“OK”的,而在第二种情况下,只有“好,不幸”。记住,标准中的代码示例是非规范的。“好”不是“好”的意思。它是“OK”的,因为它没有违反任何标准规则,因此也没有格式错误。这个例子中没有什么是“OK”的。@StoryTeller:即使你有这样的想法,这个问题仍然存在。为什么要区分这两种情况?