尝试将 std::vector<std::p air<T, U>> 转换为其左值引用时收到 VS 编译器警告 C4239
Got VS compiler warning C4239 when trying to cast std::vector<std::pair<T, U>> to its lvalue ref
我有一个类Foo
,其构造函数写成
Foo::Foo(std::vector<std::pair<int, char>> &Data)
: //Initialization list
{
//Some other initialization
}
我试图在我的代码中调用它
Foo(std::vector<std::pair<int, char>>
{
{10, 'a'}
});
然后编译器给了我一个 C4239 说
nonstandard extension used: 'argument': conversion from
'std::vector<std::pair<int,char>,std::allocator<_Ty>>' to
'std::vector<std::pair<int,char>,std::allocator<_Ty>> &'
我理解该消息,但为什么编译器对这种转换不满意?
提前谢谢。
您正在尝试将临时引用绑定到非常量引用。
考虑:
Foo::Foo(const std::vector<std::pair<int, char>> &Data)
根据Bjarne Stroustrup的C++11 - 新的ISO C++标准(强调我的):
在C++中,非常量引用可以绑定到左值,常量引用可以绑定到左值或右值,但没有任何东西可以绑定到非常量右值。这是为了防止人们改变临时值的值,这些临时值在使用新值之前就被销毁了。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++运算符<<调用::ostream而不是std::osttream
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- C++重载<<具有typedef'd std::vector
- 以x的倍数填充前导零,使用std::cout<<std::十六进制
- 错误:没有匹配'运算符<<"在'std::cout
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- std::ostream&operator< & lt; (std:: ostream&压力,压力& &;val)
- 将std::endl传递给std::operator<<
- std::映射<>或std::vector<>在处理大型标志集时
- 重载& lt; & lt;使用命名空间std