【发布时间】:2021-12-11 21:13:21
【问题描述】:
Clang compiles this fine, but GCC and MSVC complain表示operator=不能默认:
#include <type_traits>
template<class T>
struct S
{
typedef typename std::enable_if<!std::is_enum<T>::value, S>::type Me;
S &operator=(Me const &) = default;
};
int main()
{
S<int> s1, s2;
s1 = s2;
}
这个代码合法吗?如果不是,如果 Me 被定义为 typedef S Me; 是否合法?
【问题讨论】:
-
AFAIK,像这样在
typedef中使用std::enable_if是不合法的(或者至少没有意义)。它旨在用于模板参数、函数参数或函数返回值,而不是定义类型别名。您正在尝试定义复制赋值运算符,因此输入参数需要无条件为S const &。 -
一个更简单的例子:
using Me = S<T>;的所有编译器都成功,但using Me = std::type_identity_t<S<T>>;的 GCC 和 MSVC 失败 -
@Kevin
using比typedef更强大,所以这不是苹果与苹果的比较。using在模板方面更强大。 -
@sweenish:
using完全等同于typedef(语法除外),只是它可以立即在template<…>之前。 -
@sweenish 我们这里不需要 typedef 模板
标签: c++ language-lawyer defaulted-functions