我可以像这样创建一个堆栈(来自标准库的适配器类模板)对象,
stack<int, vector<int>> myStack;
Run Code Online (Sandbox Code Playgroud)
我知道第二个模板参数意味着堆栈的底层数据结构.但为什么以下行不会给出编译时错误?
stack<int, vector<string>> myStack;
Run Code Online (Sandbox Code Playgroud)
请注意,我声明堆栈包含类型的元素int,但同时我声明底层数据结构保存string元素.
从功能上讲,它就好像是一堆字符串元素.
你正在做的是未定义的行为.不过,我将解释为什么它似乎工作正常.
容器适配器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起)
您可以在此处找到此报价的来源.
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |