Vit*_*meo 17 c++ templates variadic-templates template-argument-deduction c++17
请考虑以下代码:
template <typename... Types>
struct list
{
template <typename... Args>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
};
template <typename... Args>
list(Args...) -> list<Args...>;
int main()
{
list l{0, 0.1, 'a'};
}
Run Code Online (Sandbox Code Playgroud)
我希望decltype(l)如此list<int, double, char>.不幸的是,g ++ 7.2和g ++ trunk失败了静态断言.clang ++ 5.0.0和clang ++ trunk编译并按预期工作.
这是一个g ++错误吗?或者,为什么不应该遵循演绎指南?
在构造函数上添加SFINAE约束似乎提供了所需的行为:
template <typename... Args,
typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 13
这是gcc bug 80871.问题是,我们最终得到了这组扣除的候选人:
template <class... Types, class... Args>
list<Types...> __f(Args... ); // constructor
template <class... Args>
list<Args...> __f(Args... ); // deduction-guide
Run Code Online (Sandbox Code Playgroud)
两者都是有效的(Types...在第一种情况下可以推断为空),但这里的调用应该是模糊的 - 既不比另一种更专业.Types...这里没有参与订购(类似于[temp.deduct.partial]/12中的例子).所以正确的行为是进入下一个有利于演绎指南的决胜局.因此,这应该是一个list<int, double, char>.
但是,gcc的行为是支持构造函数,因此static_assert触发器Types...在这种情况下确实是空的.
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |