我有一个我static_assert
的模板结构的移动构造函数。static_assert
即使复制省略是可能的,编译器是否需要考虑这一点?
这是精简的场景:
#include <type_traits>
template<typename T>
struct X
{
X(X&&) { static_assert(std::is_same<void, T>::value, "Intentional Failure"); }
};
auto impl() -> X<int>;
auto test() -> decltype(impl())
{
return impl();
}
int main()
{
test();
}
GCC 和 Clang 同意评估static_assert
和编译失败。
另一方面,MSCV 和 ICC 可以很好地编译代码。
有趣的是,当我删除move
构造函数的定义并像这样声明它时:
template<typename T>
struct X
{
X(X&&);
};
GCC 和 Clang 现在也编译代码。因此,所有编译器似乎都同意移动构造函数的定义与复制省略无关。
问题:
如果static_assert
复制/移动构造函数中有 a ,标准是否要求评估它,即使复制/移动省略是可能的?