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

时间:2018-11-22 16:59:45

标签: 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);
}

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();
               ~~~~~~~^~~~~~

我还没有完全理解类模板参数推导机制的复杂性。这是Clang中的错误,还是我以错误的方式使用CTAD?

1 个答案:

答案 0 :(得分:4)

这是一个lang虫[expr.type.conv]/1

  

如果该类型是推导的类类型的占位符,则将其替换为该子句其余部分中由重载解析选择的用于类模板推导的函数的返回类型。

因此模板推论也适用于函数转换表达式。

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

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