【发布时间】:2020-01-06 14:39:14
【问题描述】:
请考虑以下代码:
template <typename T>
struct Test
{
Test() = default;
explicit Test(const T& arg)
: m_member(arg)
{
}
T m_member{};
};
int main()
{
Test<int> t1;
int v2 = 34;
Test<int&> t2(v2); // (!)
return 0;
}
上面的代码是否应该编译并且没有未定义的行为?
标记为 (!) 的行使用引用类型的参数实例化类模板 Test。在这种情况下,成员 Test::m_member 的默认初始化程序无效(嗯,引用 必须 用某个对象进行初始化)。但另一方面,默认构造函数(唯一可以使用该默认初始化程序的构造函数)从未在程序中使用,因此不应实例化。
在 C++11 下,编译器是否允许/要求尝试/跳过实例化构造函数中不使用的成员的默认初始值设定项的实例化(即程序不实例化任何可能需要该初始化程序的构造函数)?
【问题讨论】:
标签: c++ c++11 language-lawyer