我一直在开发一个相当大的库,现在我正在添加一些使用C ++ 0x功能的基于模板的部分。所以我尝试使用gcc版本4.4.5(在Linux上)使用标志-std=c++0x
编译我的库(在当前标准上完全编译而没有警告)。现在我收到了大量与“临时”变量转换为非常量引用相关的错误消息。问题是,它们不是暂时的!
以下是一小段代码,可以重现错误:
#include <iostream>
#include <map>
struct scanner {
scanner& operator &(std::pair<std::string, int&> i) {
std::cout << "Enter value for " << i.first << ": ";
std::cin >> i.second;
return *this;
};
};
struct vect {
int q[3];
void fill(scanner& aScan) {
aScan & std::pair<std::string, int&>("q0",q[0])
& std::pair<std::string, int&>("q1",q[1])
& std::pair<std::string, int&>("q2",q[2]);
};
};
int main() {
vect v;
scanner s;
v.fill(s);
return 0;
};
如果使用当前标准(无c ++ 0x标志)编译它,它将按预期编译并运行。但是,如果使用-std=c++0x
编译它,它将在编译时抛出以下错误:
/usr/include/c++/4.4/bits/stl_pair.h:94: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’
我真的无法弄清楚这一点。我查看了网络和SO,但似乎没有这个问题。这是std :: pair中的错误吗?我真的很想知道问题是什么..谢谢你能给出的任何见解。
PS:不要抱怨上面代码的“质量”或“愚蠢”,它不是真正的代码..只是一个显示错误的例子。
答案 0 :(得分:4)
您的代码无效C ++ 03,comeau给出(在向op&amp;添加return语句后):
"stl_pair.h", line 44: error: qualifiers dropped in binding reference of
type "int &" to initializer of type "const int"
pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
^
detected during instantiation of "std::pair<_T1, _T2>::pair(const
_T1 &, const _T2 &) [with _T1=std::string, _T2=int &]" at
line 17 of "ComeauTest.c"
...
问题是一对内的参考。如果我没记错的话,这是一个允许这个的gcc扩展。 Gcc使用-std = gnu ++ 98接受它,这是C ++的默认值,但是使用-std = c ++ 98,gcc 4.4.3给出:
In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66,
from /usr/include/c++/4.4/algorithm:61,
from PREAMBLE:7:
/usr/include/c++/4.4/bits/stl_pair.h: In instantiation of ‘std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int&>’:
<input>:5: instantiated from here
/usr/include/c++/4.4/bits/stl_pair.h:83: error: forming reference to reference type ‘int&’
...
答案 1 :(得分:3)
使用GCC 4.5.2时,无论是否使用-std=c++0x
都可以很好地编译。
我猜GCC 4.4.5不支持C ++ 0x这么多工作。
答案 2 :(得分:3)
gcc C ++ 0x支持中有很多bug,它还没有完成,开发正在进行中。对于与gcc-4.4.5
一样久的版本,这是双重的。如果您认真考虑在批准标准之前启动C ++ 0x开发,则需要使用最新版本的编译器和标准库。
答案 3 :(得分:2)
除return *this;
中缺少scanner& operator &(std::pair<std::string, int&> i)
外,您的代码是有效的C ++ 0x。