c++ - 带有 volatile 的 push_back 与 emplace_back

标签 c++

以下代码对 push_back 失败,对 emplace_back 成功:

#include <vector>
volatile int x = 0;
int main()
{        
    std::vector<int> vec;
    vec.emplace_back(x);
    vec.push_back(x); // error: no matching function for call to 'std::vector<int>::push_back(volatile int&)'
}

我知道 push_back 失败是因为它需要一个引用并试图从该引用中隐式地丢弃 volatile 限定符。

然而,emplace_back 接受一个引用(右值引用是引用)。为什么区别对待?

最佳答案

这是因为它们在 C++11 标准中的定义方式。第 23.3.6.1 段规定了他们的签名:

template <class... Args> void emplace_back(Args&&... args);
void push_back(const T& x);
void push_back(T&& x);

虽然push_back()的可用重载参数|没有任何 volatile资格,论证emplace_back()函数模板可以用任何 cv 绑定(bind)到左值-资格。

However, emplace_back also takes a reference (rvalue-references are references). Why is it ttreated differently?

是的,因为 emplace_back()是一个函数模板,类型推导将推断出Args是一个长度为 1 的参数包,其唯一元素的类型为 int volatile& (见第 14.8.2.1/3 段)。

push_back() 的重载,另一方面,是 std::vector<> 的常规成员函数类模板,并且在调用它们时没有类型推导。由于引用非 volatile无法绑定(bind)到限定为 volatile 的对象(参见第 8.5.3/4-5 段),编译器将无法解析调用。

关于c++ - 带有 volatile 的 push_back 与 emplace_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15817259/

相关文章:

C++ 模板 - 可变参数模板和通过 const 引用传递

c++ - 为什么我会收到此代码的匿名类型警告?

c++ - 多态分配器 : when and why should I use it?

c++ - 具有字符串和整数转换的可搜索类枚举对象

c++ - 像声明变量一样调用函数

c++ - 在 dlopen 检测重复符号

c++ - C++14/17 项目是否可以使用使用 C++11 标准编译的二进制库,或者源代码是否需要重新编译?

c++ - 初始化 const 成员的正确方法

c++ - C++的语法歧义

c++ - 创建扩展名为 so 的共享库