关于c ++:为什么嵌套构造函数调用不编译?


Why don't nested constructor calls compile?

本问题已经有最佳答案,请猛点这里访问。

为什么不编译以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
typedef int Table;

class FullObjId
{
public:
    explicit FullObjId( const Table* i ) {}
};

class TableInfo
{
public:
    TableInfo( const FullObjId& o ) {}
    bool isValid() { return true; }
};

void dataSourceForHist( const Table& table )
{
   // The next line gives an error
   TableInfo tableInfo( FullObjId( &table ) );
   // Unless it's written like this:
   //TableInfo tableInfo( ( FullObjId( &table ) ) );

   if (!tableInfo.isValid())
   {
      ...
   }
}

我尝试过使用英特尔编译器12.1 Linux版,并使用http://gcc.godbolt.org/和g++4.8、icc 13.0、clang 3.4.1。我尝试过的所有编译器都在以下行中给出了一个错误:

1
error: request for member ‘isValid’ in ‘tableInfo’, which is of non-class type ‘TableInfo(FullObjId&)


1
TableInfo tableInfo( FullObjId( &table ) );

声明tableInfo为引用FullObjId的函数(参数名为table并返回tableInfo。这是所谓的最麻烦的分析。

用C++ 11解决问题:

1
TableInfo tableInfo( FullObjId{&table} );

问题(也称为最麻烦的分析)依赖于以下事实:

1
TableInfo tableInfo( FullObjId( &table ) );

解释为函数声明。

假设你使用C++ 11,你应该使用:

1
TableInfo tableInfo{ FullObjId( &table ) };

Live演示

相反。

或者,你可以添加额外的括号(C++ 03的作品):

1
TableInfo tableInfo( (FullObjId( &table )) );

Live演示