C++ 为什么stack<;常量字符串>;不在g+中编译+;?

C++ 为什么stack<;常量字符串>;不在g+中编译+;?,c++,templates,stl,g++,C++,Templates,Stl,G++,我在维护一个大型(相对于我们团队的规模)项目的端口时遇到了这个问题,但是创建一个小示例很简单。 stackoverflow.cpp: #include<iostream> #include<string> #include<stack> using namespace std; int main (int argc, char *argv[]) { stack<const string> strstack; string str("H

我在维护一个大型(相对于我们团队的规模)项目的端口时遇到了这个问题,但是创建一个小示例很简单。 stackoverflow.cpp:

#include<iostream>
#include<string>
#include<stack>

using namespace std;


int main (int argc, char *argv[]) {
  stack<const string> strstack;
  string str("Hello, world");
  strstack.push(str);
  cout << strstack.top() << endl;
  return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[]){
堆垛机;
字符串str(“你好,世界”);
strstack.push(str);

cout标准容器的成员必须是可复制分配或可移动的(C++11)。如果类型为
const
,则不符合要求。

容器可以容纳指针(或者最好是智能指针)这将保持所需的常量语义,尽管语法可能有点笨拙

例如:

stack<shared_ptr<string const>> s;
s.push(make_shared<string>("foo"));
cout << *s.top() << endl;
stacks;
s、 推送(使共享(“foo”);

可以啊,那么接受这种情况是MSV是非标准的吗?在这种情况下,我很乐意更改我们的代码。这取决于你在做什么。如果你没有使用容器的所有功能,你可能不会满足所有的要求。实现不需要失败,即使它是允许的答案是错误的。据我所知,容器元素的唯一通用C++11要求是它们是可破坏的(并且在C++03中不存在移动)。请引用标准中的章节。@01d55:赋值要求可赋值项是。这并不意味着“标准容器的成员必须是可复制分配或可移动的”。这意味着,如果您分配给容器,那么它必须具有可分配的项(对于其他操作,同上,您实际使用的每个操作都必须是可能的).这个答案是错误的,排除了例如
std::list
const
项目。@cheers-sandhth.-Alf我同意,但不是官方说:“对元件的要求取决于在容器上执行的实际操作。通常,要求元件类型为完整类型并满足可擦除的要求,但许多成员函数要求更严格。“如果我们现在允许使用两个句子的答案,那么它们至少应该有一个有效的来源。这个答案最多应该是一个注释。它在MSVC中编译的事实实际上是由于MSVC进行模板实例化的方式中存在一个错误。(没有小错误,他们不会修复它,因为它会破坏很多现有代码)
stack<shared_ptr<string const>> s;
s.push(make_shared<string>("foo"));
cout << *s.top() << endl;