堆栈模板参数

Ahm*_*hal 4 c++ c++11

专注于模板参数

我可以像这样创建一个堆栈(来自标准库的适配器类模板)对象,

stack<int, vector<int>> myStack;
Run Code Online (Sandbox Code Playgroud)

我知道第二个模板参数意味着堆栈的底层数据结构.但为什么以下行不会给出编译时错误?

stack<int, vector<string>> myStack;
Run Code Online (Sandbox Code Playgroud)

请注意,我声明堆栈包含类型的元素int,但同时我声明底层数据结构保存string元素.

从功能上讲,它就好像是一堆字符串元素.

nsh*_*hct 6

你正在做的是未定义的行为.不过,我将解释为什么它似乎工作正常.

容器适配器std::stack<T, TContainer>包含多个类型符号,这些符号是常用类型的别名.有一个列表在这里.

我们在这里关注的是std::stack::value_type.它基本上决定了方法std::stack::push和朋友所期望的类型:

void push( const value_type& value );
Run Code Online (Sandbox Code Playgroud)

我们还可以看到它是如何定义的:

using value_type = typename TContainer::value_type
Run Code Online (Sandbox Code Playgroud)

因此,在所有操作中使用的类型实际上仅基于第二种类型,TContainer!在你的情况下,也就是说vector<string>::value_type,value_type将是别名string.用于类型T,int在你的情况下,不使用.因此,一切似乎都有效.

但是,即使这部作品在您的情况与特定的编译器,它实际上是不允许的:

如果T与Container :: value_type的类型不同,则行为未定义.(自C++ 17起)

您可以在此处找到此报价的来源.