GCC 没有给我一个我希望它会出现的例子的错误:
class CannotBeCopied {
public:
CannotBeCopied(const CannotBeCopied&) = delete;
CannotBeCopied& operator=(const CannotBeCopied&) =delete;
CannotBeCopied() { }
~CannotBeCopied() { }
};
template<class T>
class FirstVector {
public:
FirstVector() {
size = 1;
data = new T[size];
}
~FirstVector() {
delete[] data;
}
FirstVector(const FirstVector& source) {
size = source.size;
data = new T[size];
for(int k=0;k!=size;k++) {
data[k] = source.data[k]; //<--I EXPECT AN ERROR HERE
}
}
private:
int size;
T* data;
};
不使用复制构造函数时不会发生此错误(即,使用复制构造函数时会发生)。
由于模板的原因,我不能简单地将复制构造器移动到代码文件中,然后在编译时失败。
我怎样才能让它失败?
这不是SFINAE,应该是不能实例化模板的。如果 copy-ctor 本身就是一个模板方法(比如说:
template<class U=T>
在上面那一行,那就是SFINAE。
我使用的是 GCC 4.8.1,-pedantic -Wall -Wextra
当然还有 -std=c++11
我希望通过以下方式让它失败:
int main() {
FirstVector<CannotBeCopied> whatever;
}
我知道 GCC 只是懒惰,不做不需要的工作,但我不喜欢这样,如果我在代码文件中显式实例化这个模板,我会得到一个错误。有没有办法得到我想要的错误?
最佳答案
如果您实际上没有创建模板的实例,则不需要调用复制构造函数 - 甚至不会为 CannotBeCopied
创建模板代码,如果您不这样做用它。调用复制构造函数,你会得到错误:
FirstVector<CannotBeCopied> a;
FirstVector<CannotBeCopied> b = a;
编辑:您还可以通过添加
使用模板及其所有成员的显式实例化template class FirstVector<CannotBeCopied>;
(语言规范§14.7.2)
关于c++ - 为什么 GCC 不给我一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28578061/