在.h文件中
class X{
private:
std::chrono::minutes A;
public:
X(std::chrono::minutes& a = std::chrono::minutes {5});
}
在.CPP文件中
X::X(std::chrono::minutes& a): A(a){}
在分配给A
之前,std :: chrono :: minutes {5}可以超出范围例如,
void main()
{
X x;
}
是否保证对象x的成员A的值始终为std :: chrono :: minutes {5}?
答案 0 :(得分:3)
让我们看一下代码的简化版本:
#include <chrono>
struct X{
std::chrono::minutes A;
X(std::chrono::minutes const& a = std::chrono::minutes {5})
: A(a){}
};
void main()
{
X x; //Construction.
}
我已将参考更改为const
,以符合标准。
这段代码很好。临时是在main(在标记为“构造”的行)的上下文中创建的,并且引用参数绑定到它。调用构造函数,一旦参数超出范围,临时就会被销毁。
(当然,如果成员变量是引用而不是实际对象,那么你将有一个悬空引用。)
使用非const引用的编译器定义是违反约束 - 您不能将非const引用绑定到临时。可悲的是,默认情况下,MSVC不会抱怨这一点。在MSVC17之前,你唯一能做的就是:
最后在VC2017,他们引入了/permissive-(我强烈建议您作为默认设置)。