我有一个类似于这个的类:
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)
这也没有帮助.这是正确的语法还是有一种方法来为默认构造函数指定演绎指南?
这个程序是正确的:
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)
没有初始化程序.第一个是可行的候选者(推论T为char),第二个不是,所以第一个是最好的可行候选者.所以我们最终c得到了类型C<char>.当我们对默认构造进行重载解析时,这是有效的,所以程序很好.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |