c++ - 为什么 GCC 不给我一个错误

标签 c++ gcc

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/

相关文章:

c - 优化慢循环

c++ - 我可以重载 operator= 将一个类的对象分配给另一个类的变量,但两个类都来自同一个类模板

c++ - 即使有填充,Sizeof 结构也不清楚

C++:2个数组之间的差异

c++ - 关于C++组件化的一个想法

android - 无法加载库 soinfo_relocate(linker.cpp :975): cannot locate symbol "log2f" referenced by "libvlfeat.so"

c++ - 具有动态共享内存的模板化 CUDA 内核

linux - 交叉编译和CMake?

使用共享库在 Linux 中编译 C 程序

c++ - 函数没有实现宏?