c++ - 使用平凡的复制构造函数传递类对象,但没有输出?

标签 c++ c++11 language-lawyer ellipsis

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

#include <iostream>

struct A {
  A(){}

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

void f(...) { }

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

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

最佳答案

看起来您期望的是标准定义的行为。

模板函数不会阻止复制构造函数/赋值运算符的创建。所以模板函数不会阻止一个类被认为是“平凡可复制的”。但是,当需要实际复制它们时,它们确实参与了重载决议,因此它们可以进行干预。由于此示例中的 a 是非常量左值,因此它比 A(const A&)< 更适合签名 A(A&)/。所以它调用了模板函数。

(尽管我不明白你为什么不费心在你的问题中解释所有这些,因为你显然做了你的研究。)

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

关于c++ - 使用平凡的复制构造函数传递类对象,但没有输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215764/

相关文章:

c++ - 在构造函数初始化器中初始化成员数组

c++ - 在将字符串转换为 ptime 时使用 %f 标志 boost ptime input_facet 错误

c - 具有包含对静态对象的引用的外部链接的内联函数定义

c++ - 为什么在 constexpr 函数中不允许 goto?

c++ - 继承的构造函数忽略类内初始化

c++ - Visual Studio 不允许我使用 sqrt 或 floor,对重载函数的调用不明确

c++ - 围绕某个点旋转对象,即使原始枢轴不同?

C++ 创建巨大的 vector

c++ - 带有列表初始化的模棱两可的构造函数调用

c++ - 为什么在C++中收到重新定义错误?