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 ) );
声明
用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演示