我用 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/