【问题标题】:Can special member functions be defaulted if they use typedefs?如果特殊成员函数使用 typedefs 可以默认吗?
【发布时间】: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 &amp;
  • 一个更简单的例子:using Me = S&lt;T&gt;; 的所有编译器都成功,但using Me = std::type_identity_t&lt;S&lt;T&gt;&gt;; 的 GCC 和 MSVC 失败
  • @Kevin usingtypedef 更强大,所以这不是苹果与苹果的比较。 using 在模板方面更强大。
  • @sweenish: using 完全等同于typedef(语法除外),只是它可以立即template&lt;…&gt;之前。
  • @sweenish 我们这里不需要 typedef 模板

标签: c++ language-lawyer defaulted-functions


【解决方案1】:

鉴于没有任何相反的迹象,我将回答我自己的问题并说,就我能够在标准中找到相关条款而言,我认为代码是合法,因此 GCC 和 MSVC 错误地抱怨。

正如上面有人指出的,似乎有一个bug report 跟踪这个问题。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2016-07-03
    • 2015-01-15
    相关资源
    最近更新 更多