Joh*_*itb 8 c++ ellipsis language-lawyer c++11
我和GCC和Clang一起尝试了这个程序,但两者都没有输出
#include <iostream>
struct A {
A(){}
template<typename T>
A(T &) {
std::cout << "copied!";
}
};
void f(...) { }
int main() {
A a;
f(a);
}
Run Code Online (Sandbox Code Playgroud)
根据我的标准阅读,该程序应该输出"copied!".任何人都可以告诉我,我是否错了,或者这是否是这两个编译器中的错误?
看起来您所期望的是标准定义的行为。
模板函数不会阻止创建复制构造函数/赋值运算符。因此,模板函数不会阻止类被视为“可简单复制”。但是,当实际复制它们时,它们确实会参与重载决策,因此它们可能会产生干扰。并且由于a在此示例中是非常量左值,因此它A(A&)比它更适合签名A(const A&)。所以它调用了模板函数。
(尽管我不明白为什么你不费心在你的问题中解释所有这些,因为你显然做了你的研究。)
然而,考虑到这是一个多么小的极端情况,我不会依赖这种行为来强制可平凡复制的类不被平凡复制。
| 归档时间: |
|
| 查看次数: |
348 次 |
| 最近记录: |