为什么 operator= 不适用于具有新模板放置的标准类型?

amo*_*rdo 4 c++ syntax operator-overloading

所以 ~T() 甚至适用于标准类型(不是类/结构)我认为operator=(const T &)也可以作为默认方法有效,但它不是:

#include <new>

template <class T> void foo(T el) {
  alignas(T) unsigned char buf[sizeof(T)];
  T *ptr = new (buf) T(el);
  // error: request for member 'operator=' in '* ptr', which is of non-class type 'int'
  // ptr->operator=(42);
  ptr->~T();
}

int main() { foo(42); }
Run Code Online (Sandbox Code Playgroud)

~T() 合成结构是否与标准类型兼容?

Jer*_*fin 5

是的。该标准定义了“伪析构函数调用”,因此类似于ptr->~T()ref.~T()对内置标量类型有效(§[expr.prim.id.dtor]):

  1. 表示类型析构函数的id 表达式将ifT的析构函数命名为类类型 (11.4.6),否则称id 表达式命名伪析构函数TT
  2. 如果id 表达式命名为伪析构函数,T则应为标量类型,并且id 表达式应作为构成函数调用后缀表达式的类成员访问 (7.6.1.4) 的右操作数出现(7.6. 1.2)。[注意:这样的调用没有效果。—尾注]

无论好坏,对于对内置标量类型有效的其他运算符都没有做同样的事情,因此(如您所见)some_int.operator=例如,您不能引用)。

已经(相当多的)讨论了某种统一的函数调用语法,这将允许编译器至少整理出一些这样的东西,但尽管它至少被提出过几次(早期由 Francis Glassborrow 提出,更多最近由 Bjarne 和 Herb Sutter),它没有被接受。如果您对此感兴趣,除了在 C++ 中使用它之外,D 确实支持此顺序的某些内容,您可能会觉得研究很有趣。

以外的是,虽然它不是那么容易,因为你可能会喜欢,你可以很可能使用SFINAE之间进行选择foo = bar;foo.operator=(bar);,如果你真的需要的话(虽然我承认,我不知道你会得到什么好处在.operator=语法)。