对于此结构:
struct Wrapper {
int value;
constexpr explicit Wrapper(int v) noexcept : value(v) {}
Wrapper(const Wrapper& that) noexcept : value(that.value) {}
};
而这个功能:
constexpr Wrapper makeWrapper(int v)
{
return Wrapper(v);
}
以下代码无法针对Clang(Apple LLVM版本7.3.0)进行编译,但对于GCC(4.9+)均可使用
-Wall -Wextra -Werror -pedantic-errors
进行编译:constexpr auto x = makeWrapper(123);
Clang提示“在常量表达式中不能使用非constexpr构造函数'Wrapper'”。哪个编译器正确?
最佳答案
尽管可以取消从Wrapper
返回makeWrapper()
时的复制或移动,但它必须与C++ 14一起存在。现有的复制构造函数为non-constexpr
,并且它的存在禁止创建隐式move构造函数。结果,我认为clang是正确的:您需要将复制构造函数设为constexpr
。
请注意,使用C++ 17时,代码可能变得正确:有人提议在某些情况下必须强制执行复制删除:P0135r0。但是,似乎此更改尚未出现在工作文件中。不过,它可能会在本周登陆(感谢@NicolBolas指出它还不存在)。我还没有在mailing中看到更新的论文。
关于c++ - GCC和Clang在constexpr构造函数上的不同行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37932066/