我用GCC和Clang尝试了这个程序,但两者都没有输出
#include <iostream>
struct A {
A(){}
template<typename T>
A(T &) {
std::cout << "copied!";
}
};
void f(...) { }
int main() {
A a;
f(a);
}
根据我的标准阅读,该程序应输出"copied!"
。任何人都可以告诉我,我是否错了,或者这是否是这两个编译器中的错误?
答案 0 :(得分:3)
您期望的是标准定义的行为。
模板函数不会阻止创建复制构造函数/赋值运算符。因此,模板函数不会阻止类被视为“可以轻易复制”。但是,当实际复制它们时,它们做参与重载解析,因此它们可能会干扰。由于此示例中的a
是非const l值,因此它最适合签名A(A&)
而不是A(const A&)
。所以它调用模板函数。
(虽然为什么你没有在你的问题中解释所有这些因为你明显做了你的研究而烦恼了。)
然而,考虑到这种情况有多么小,我不会依赖这种行为来强迫平凡的可复制类不被轻易复制。