C++ C+;中对非常量引用的转换无效+;0x。。。std::pair中的bug?

C++ C+;中对非常量引用的转换无效+;0x。。。std::pair中的bug?,c++,c++11,C++,C++11,我一直在开发一个越来越大的库,现在我正在添加一些使用C++0x特性的基于模板的部件。因此,我尝试使用gcc版本4.4.5(在Linux上)编译我的库(在当前标准中编译时完全没有警告)。现在我收到了大量与将“临时”变量转换为非常量引用相关的错误消息。问题是,它们不是暂时的 下面是一段复制错误的代码: #include <iostream> #include <map> struct scanner { scanner& operator &(std::

我一直在开发一个越来越大的库,现在我正在添加一些使用C++0x特性的基于模板的部件。因此,我尝试使用gcc版本4.4.5(在Linux上)编译我的库(在当前标准中编译时完全没有警告)。现在我收到了大量与将“临时”变量转换为非常量引用相关的错误消息。问题是,它们不是暂时的

下面是一段复制错误的代码:

#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;
};
我真的搞不懂。我已经浏览过网络,但似乎没有人有这个问题。它是std::pair中的一个bug吗?我很想知道问题出在哪里。。感谢您提供的任何见解


注:不要抱怨上面代码的“质量”或“愚蠢”,它不是真正的代码。。这只是一个显示错误的示例。

无论是否使用GCC4.5.2,它都可以很好地编译


我想GCC4.4.5不太支持C++0x以使其正常工作。

GCC C++0x支持中有很多错误,它还没有完成,开发正在进行中。对于像
gcc-4.4.5
这样的旧版本来说,这是双重事实。如果您真的想在批准标准之前启动C++0x开发,则需要使用最新版本的编译器和标准库。

您的代码无效C++03,gives(在向op&添加return语句后):

“stl_pair.h”,第44行:错误:在的绑定引用中删除了限定符
输入“int&”到“const int”类型的初始值设定项
成对(常数T1和a,常数T2和b):第一个(常数a),第二个(常数b){}
^
在实例化“std::pair::pair(const)”时检测到
_T1&,const _T2&[带_T1=std::string,_T2=int&]”位于
“ComeauTest.c”第17行
...
问题是一对中的引用。如果我没记错的话,它是一个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&’
...
在/usr/include/c++/4.4/bits/stl_algobase.h:66中包含的文件中,
来自/usr/include/c++/4.4/算法:61,
序言:7:
/usr/include/c++/4.4/bits/stl_pair.h:在“std::pair”的实例化中:
:5:从此处实例化
/usr/include/c++/4.4/bits/stl_pair.h:83:错误:正在形成对引用类型“int&”的引用
...

除了缺少的
返回*这个
扫描器和运算符&(std::pair i)
中,您的代码是有效的C++0x。

您能否更改
运算符&
以接受对其参数的常量引用?现在,您正在传递值,这需要制作一个副本,这是失败的。。。成功了!但是,为什么当前的标准没有问题呢?因为,g++的默认设置启用了特定于gcc的扩展
-std=c++0x
不仅启用了c++0x,还禁用了gcc扩展。启用C++0x特性(仍在开发中)和gcc扩展的
-std=gnu++0x
会发生什么?
"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"
...
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&’
...