C++11 编译器将新对对象分配给现有对对象时出错
以下代码使用32位编译器在C++Builder XE7中生成错误:C++11 编译器将新对对象分配给现有对对象时出错,c++11,boost,c++builder-xe7,C++11,Boost,C++builder Xe7,以下代码使用32位编译器在C++Builder XE7中生成错误: #include <utility> #include <boost/any.hpp> std::pair< int, boost::any > y; void test() { y = std::pair< int, boost::any >( 1, 2 ); // error! } 错误是: "Could not
#include <utility>
#include <boost/any.hpp>
std::pair< int, boost::any > y;
void test()
{
y = std::pair< int, boost::any >( 1, 2 ); // error!
}
错误是:
"Could not find a match for 'operator std::pair<int,boost::any>::=(std::pair<int,boost::any>)'"
我不明白。这段代码本身并没有什么问题,而且在更老的编译器中编译得很好。下面是一些有趣的内容:
1 64位编译器编译代码时不会出错
2如果我将该对的第二个类型从“boost::any”更改为内置类型,例如“int”,则代码编译时不会出错
作为一种变通方法,我能够做到:
#include <utility>
#include <boost/any.hpp>
std::pair< int, boost::any > y;
void test()
{
std::pair< int, boost::any > temp = std::pair< int, boost::any >( 1, 2 );
y = temp;
}
它的效率较低,但它使我避开了编译器错误
<>直到最近,我一直使用过时的C++编译器C++ +Builder 5/6,所以我没有跟上C++标准和C++ 11的变化。因此,我可能不知道有语言更改导致此代码无效。那么,有人能告诉我这个编译器错误是由于语言的改变,还是编译器的错误
谢谢
Dennis我认为32位编译器10美元是没有希望的,如果你真的要构建32位可执行文件,那么作为一种解决方法,你可以使用TVariant而不是boost::Any。你的第一个例子调用操作符=&&,第二对-&然后操作符=常量&。在第二个示例中,向赋值添加一个移动,是否会得到相同的错误?std::move是C++11的一部分,32位编译器不支持它,但它正在工作。