【发布时间】:2012-02-27 21:19:57
【问题描述】:
我正在编写这段代码的一半,并在点击构建按钮之前认为这显然不会编译。我很惊讶它不仅可以编译,而且可以链接和工作。
如果我猜我会说 SFINAE 负责它的编译...是吗?
struct BaseClass
{
public:
BaseClass() {}
template<typename T>
BaseClass(const T& a_other)
{
int i = 0; // for break point
}
template<typename T>
BaseClass& operator= (const T& a_other)
{
int i = 0; // for break point
return *this;
}
private:
BaseClass(const BaseClass& a_other); // Does not have a definition
BaseClass& operator= (const BaseClass& a_other); // Does not have a definition
};
struct MyClass : public BaseClass
{
};
int main()
{
MyClass i, j;
i = j;
return 0;
}
编辑:我使用的是 Visual-C++ 2008,可能是 VS 的一个奇怪的怪癖
【问题讨论】:
-
您具体问的是哪一部分?有模板函数,还有未定义的复制和赋值运算符,我可以想象有人期待某种失败。
-
@GregHewgill: Line
i = j... 不应该简单地告诉我赋值运算符是私有的吗? -
我认为这个问题是相关的:stackoverflow.com/questions/8984013/….
-
这不能在 gcc 4.6.1 下编译,启用 C++11:错误说:在函数 'int main()' ... 使用已删除的函数 'MyClass& MyClass ::operator=(const MyClass&) MyClass& MyClass::operator=(const MyClass&)' 被隐式删除,因为默认定义格式错误:| BaseClass& BaseClass::operator=(const BaseClass&)' 是私有的|
-
它不能编译。如果是这样,那就是一个 VC++ 错误。