声明对引用类型的引用时发生gcc错误

时间:2013-12-12 12:09:14

标签: c++ compiler-errors gcc4.8 cray

在OpenCV库中有一个

typedef const _InputArray& InputArray;

在我们的代码中,我们有以下函数定义:

void wimshow(const String& winName, InputArray &img) {

编译时会发生以下错误:

error: cannot declare reference to 'cv::InputArray {aka const class cv::_InputArray&}' void wimshow(const String& winName, InputArray &img) {

奇怪的是,只有在Cray环境中使用GCC 4.8.1才会出现此错误。在具有GCC 4.8.1的普通Linux环境中进行编译可以正常工作 乍一看,我会说对引用类型的引用无论如何都不是很有意义,但我很好奇什么可能导致不同的编译器行为!?

2 个答案:

答案 0 :(得分:5)

这似乎是C ++ 03 / C ++ 11的差异。

在C ++ 11中,额外的&(和const,偶然)应该被忽略:

  

[C++11: 8.3.2/6]: 如果typedef(7.1.3),则类型模板参数(14.3.1)或decltype-specifier(7.1.6.2)表示键入TR,它是对类型T的引用,尝试创建类型“对 cv TR的左值引用”会创建类型“左值”引用T,而尝试创建” cv TR的rvalue引用“会创建类型TR

     

[例如:

int i;
typedef int& LRI;
typedef int&& RRI;
LRI& r1 = i;           // r1 has the type int&
const LRI& r2 = i;     // r2 has the type int&
const LRI&& r3 = i;    // r3 has the type int&
RRI& r4 = i;           // r4 has the type int&
RRI&& r5 = 5;          // r5 has the type int&&
decltype(r2)& r6 = i;  // r6 has the type int&
decltype(r2)&& r7 = i; // r7 has the type int&
     

-end example]

此处的相关示例是r1;虽然typedef int& LRI与您的typedef不完全相同,但由于以下段落已经删除了const,因此示例相同:

  

[C++11: 8.3.2/1]: [..] 除非通过使用typedef(7.1.3)或模板引入cv限定符,否则Cv限定引用的格式不正确type argument(14.3),在这种情况下,将忽略cv限定符。 [..]

但是,C ++ 03中不存在[C++11: 8.3.2/6]措辞!实际上,我们可以使用以下示例程序比较两种语言之间的行为:

struct T1 {};

typedef T1& T2;

int main()
{
    T1 x;
    T2& t = x;
}

(忽略有关未使用变量的警告)

因此,请检查每个平台上的编译标记,以确保您在两个平台上使用相同的语言。可能是Cray上的默认值是C ++ 03,但是你平台上的默认值是C ++ 11。使用-std=c++03 / -std=c++11标志来明确明确使用哪个。

答案 1 :(得分:1)

对引用的引用(作为const const)应该被忽略,以使元模板编程更容易,因此您在Cray系统上看到的错误是一个错误。