8

我用 GCC 和 Clang 尝试了这个程序,但都没有输出

#include <iostream>

struct A {
  A(){}

  template<typename T>
  A(T &) {
    std::cout << "copied!";
  }
};

void f(...) { }

int main() {
  A a;
  f(a);
}

根据我的标准阅读,这个程序应该输出"copied!". 谁能告诉我是我弄错了还是这两个编译器中的错误?

4

1 回答 1

3

您所期望的似乎是标准定义的行为。

模板函数不会阻止创建复制构造函数/赋值运算符。所以模板函数不会阻止一个类被认为是“可简单复制的”。但是,在实际复制它们时,它们确实参与了过载解决,因此它们可以进行干预。并且由于a在这个例子中是一个非常量 l 值,它A(A&)比它更适合签名A(const A&)。所以它调用了模板函数。

(虽然你为什么不费心在你的问题中解释所有这些让我感到困惑,因为你显然做了你的研究。)

但是,考虑到这种极端情况有多小,我不会四处依赖这种行为来强制可简单复制的类不被简单复制。

于 2012-11-04T04:00:29.680 回答