繁体   English   中英

GNU C ++无法创建常量自定义类实例的向量

[英]GNU C++ can not create vector of constant custom class instances

我有一个非常简单的演示程序,可以很好地编译Microsoft Visual C ++:

#include <cstdio>
#include <vector>
#include <string>

using namespace std;

class String
    :public wstring
{
public:
    String(void)
    {
    }

    String(const String &other)
        : wstring(other)
    {
    }
};

int main(void)
{
    vector<const String> v;
    v.push_back(String());
    printf("Hello, World!");
    return 0;
}

它创建常量字符串的向量。 但是,在GNU C ++ 4.8.2中,它提供了许多错误,试图说不可能创建常量String对象的向量。 当我替换vector<const String>vector<String> ,它编译。 这种GNU C ++行为的原因是什么?

std::vector以特定的方式处理类的实例,以便进行内存管理。 它对数据执行的一些操作需要复制构造函数和赋值运算符或noexcept移动构造函数/赋值运算符。 GCC非常正确,不能编译你没有任何这些的例子。 const T不能是std::vector的有效类型。

标准库容器使用分配器。 对于分配器感知容器类型X及其分配器AX::value_typeA::value_type必须相同。 由于您的X::value_typeconst String ,因此A::value_type也将是const String 但是,标准只定义了具有value_type s的分配器,它是“任何非const,非引用对象类型”(表27 [allocator.requirements])没有定义具有const类型的分配器的要求,所以只是尝试创建具有const值类型的容器将导致未定义的行为。

除此之外,对容器的许多操作都要求值类型可以复制/移动分配,因此您可能不会在使用它时走得太远。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM