调用使用类模板参数推导创建的临时对象的方法

Nik*_*nes 7 c++ gcc clang language-lawyer c++17

我有以下使用类模板推导的C++ 17代码:

template <typename T>
struct Test {
        T t;
        Test(T t) : t(t) {}
        bool check() { return true; }
};

template <typename T>
bool check(T t) {
        return Test(t).check();
}

int main() {
        return check(1);
}
Run Code Online (Sandbox Code Playgroud)

gcc 8.2编译没有任何问题,而clang 7.0抱怨:

test.cpp:10:16: error: member reference base type 'Test' is not a structure or union
        return Test(t).check();
               ~~~~~~~^~~~~~
Run Code Online (Sandbox Code Playgroud)

我还没有完全掌握类模板参数推导机制的复杂性.这是clang中的错误还是我以错误的方式使用CTAD?

Oli*_*liv 4

这是一个 clang bug [expr.type.conv]/1

如果该类型是推导类类型的占位符,则它将替换为本子条款其余部分的类模板推导重载决策所选择的函数的返回类型。

所以模板推导也适用于函数转换表达式。

您可以通过以下方式规避此 clang 错误:

template <typename T>
    bool check(T t) {
    auto x=Test(t);
    return x.check();
    }
Run Code Online (Sandbox Code Playgroud)