繁体   English   中英

push_back vs emplace_back with volatile

[英]push_back vs emplace_back with a volatile

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 需要引用(rvalue-references是引用)。 为什么区别对待?

这是因为它们在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 emplace_back()绑定到lvalues。

但是,emplace_back也需要引用(rvalue-references是引用)。 为什么它的处理方式不同?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM