无效转换为C ++ 0x中的非const引用... std :: pair中的错误?

时间:2011-02-01 16:51:03

标签: c++ c++11

我一直在开发一个相当大的库,现在我正在添加一些使用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:不要抱怨上面代码的“质量”或“愚蠢”,它不是真正的代码..只是一个显示错误的例子。

4 个答案:

答案 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。