使用指向常量 c 字符串的指针在构造函数上编译错误

Compile error on constructor using pointer to constant c-string

有人可以解释为什么我可以编译 运行 这个

    T t1( T2( "TEST") );
    t1.print();

但不是这个

    const char * TEST_STRING = "TEST";
    T t1( T2( TEST_STRING ) );
    t1.print();

第二块显示

error: request for member ‘print’ in ‘t1’, which is of non-class type ‘T(T2)’

类如下

class T2 {
public:
    T2( const char * str ) {
        m_str = str;
    }

    void test() const {
        cout << "t2 test" << m_str << endl;
    }
private:
    const char * m_str;
};

class T {
public:
    T( const T2 & t2 ) {
        t2.test();
    }

    void print() {
        cout << "t print " << endl;
    }
};

我的 g++ 版本是

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

谢谢

感谢 immibis, Richard Critten, aschepler and wiki

的所有评论

问题是因为

T t1( T2( TEST_STRING ) );

可以解释为

  1. 函数名 t1 的函数声明以 T2 作为参数,return T
  2. class T 的 t1 的变量定义,用 class T2 的匿名实例初始化。

并被解释为函数声明。

两个可能的干净修复,来自 aschepler

Another workaround: T t1( static_cast<T2>( TEST_STRING ) );

Or just: T t1(( T2(TEST_STRING) )); (Extra parentheses are allowed around a declarator, but not around a full function parameter, so that can't possibly mean a function declaration.)