默认模板参数的模板推导

fsc*_*enm 7 c++ c++17

我有一个类似于这个的类:

template <class T = char>
struct C {
    T value;
};
Run Code Online (Sandbox Code Playgroud)

高达C++ 14,当我想使用默认模板参数时,我总是必须指定空尖括号:

void f() {
    C<> c;
    c.value = 'x';
}
Run Code Online (Sandbox Code Playgroud)

由于C++ 17支持类模板参数推导和显式推导指南,我想知道现在是否有办法使上面的代码工作而不指定空的尖括号:

void f() {
    C c;
    c.value = 'x';
}
Run Code Online (Sandbox Code Playgroud)

如果我用它编译它,这段代码在GCC 8.0中有效-std=gnu++17.但是,它仍然在Clang 6.0和Visual Studio 15.7中显示错误.哪种编译器在这种情况下是正确的?

我也试过指定这样的演绎指南:

C() -> C<char>;
Run Code Online (Sandbox Code Playgroud)

这也没有帮助.这是正确的语法还是有一种方法来为默认构造函数指定演绎指南?

Bar*_*rry 7

这个程序是正确的:

template <class T = char>
struct C {
    T value;
};

int main() {
    C c;
    c.value = 'x';
}
Run Code Online (Sandbox Code Playgroud)

clang还没有完全支持类模板参数推导(注意它确实在trunk上编译).


类模板参数推导将尝试对候选集执行重载解析:

template <class T=char> auto __f()     -> C<T>
template <class T=char> auto __f(C<T>) -> C<T>
Run Code Online (Sandbox Code Playgroud)

没有初始化程序.第一个是可行的候选者(推论Tchar),第二个不是,所以第一个是最好的可行候选者.所以我们最终c得到了类型C<char>.当我们对默认构造进行重载解析时,这是有效的,所以程序很好.