考虑以下代码:
struct X{
explicit X(){}
explicit X(const X&){}
};
void foo(X a = X()){}
int main(){}
Run Code Online (Sandbox Code Playgroud)
使用C++ 14标准,GCC 7.1和clang 4.0都拒绝代码,这正是我所期望的.
但是,使用C++ 17(-std=c++1z),它们都接受代码.什么规则变了?
对于两个编译器都表现出同样的行为,我怀疑这是一个bug.但据我所知,最新的草案仍然说,默认参数使用复制初始化 1的语义.同样,我们知道explicit构造函数只允许直接初始化 2.
所以,我的问题很简单:
将默认类构造函数指定为noexcept或constexpr(或任何其他可能的东西)是否有任何意义?
struct foo
{
foo() = default;
// vs
constexpr foo() noexcept = default;
// same thing would apply for copy/move ctors and assignment operators
};
Run Code Online (Sandbox Code Playgroud)
两者的行为方式是否相同?
这取决于课程是否为POD?例如,使用上面的示例,两者的行为方式相同,而如果我有一个std::vector<int> v = { 1, 2, 3, 4 };使用类内赋值的私有成员,则foo() = default;默认情况下noexcept不会constexpr.
通过编写foo() = default;,编译器只选择最佳版本:noexcept如果可能,constexpr如果可能,等等?