相关疑难解决方法(0)

对C++的哪些更改使得使用显式构造函数的类的复制初始化工作?

考虑以下代码:

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.

1:dcl.fct.default/5 ; 2:class.conv.ctor/2

c++ explicit language-lawyer c++14 c++17

17
推荐指数
1
解决办法
635
查看次数

默认情况下是默认构造函数/赋值noexcept/constexpr吗?

所以,我的问题很简单:

将默认类构造函数指定为noexceptconstexpr(或任何其他可能的东西)是否有任何意义?

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如果可能,等等?

c++ c++11 c++14

13
推荐指数
1
解决办法
869
查看次数

标签 统计

c++ ×2

c++14 ×2

c++11 ×1

c++17 ×1

explicit ×1

language-lawyer ×1