对于此结构:

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/

10-11 22:54
查看更多