This question already has an answer here:
Template Argument Deduction Broken in Clang 6 for Temporary Objects

(1个答案)


2年前关闭。




我有以下使用类模板推导的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?

最佳答案

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



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

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

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

08-26 19:55
查看更多