簡體   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