我有一个非常简单的演示程序,可以很好地编译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 ++行为的原因是什么?
答案 0 :(得分:5)
std::vector
以特定方式处理您的类的实例,以便进行内存管理。它对数据执行的一些操作需要复制构造函数和赋值运算符或noexcept移动构造函数/赋值运算符。 GCC非常正确,不能编译你没有任何这些的例子。 const T
不能是std::vector
的有效类型。
答案 1 :(得分:4)
标准库容器使用分配器。对于支持分配器的容器类型X
及其分配器A
,X::value_type
和A::value_type
必须相同。由于您的X::value_type
为const String
,A::value_type
也将为const String
。但是,标准只定义了具有value_type
s的分配器,它是“任何非const,非引用对象类型”(表27 [allocator.requirements])具有const
的分配器的要求type未定义,因此只是尝试创建具有const
值类型的容器将导致未定义的行为。
除此之外,对容器的许多操作都要求值类型可以复制/移动分配,因此使用它可能不会太远。