C++17模板演绎指南不用于空参数集?
C++17 template deduction guide not used for empty parameter set?
考虑以下简化示例,该示例也可以在 https://godbolt.org/g/Et56cm 查看:
#include <utility>
template <class T> struct success
{
T value;
constexpr success(T &&v)
: value(std::move(v))
{
}
constexpr success(const T &v)
: value(v)
{
}
};
template <> struct success<void>
{
};
template <class T> success(T /*unused*/)->success<T>;
success()->success<void>;
int main(void)
{
auto a = success{5}; // works
auto b = success{}; // works
auto c = success{"hello"}; // works
auto d = success(5); // works
auto e = success(); // FAILS!
auto f = success("hello"); // works
static_assert(std::is_same<decltype(a), success<int>>::value, "");
static_assert(std::is_same<decltype(b), success<void>>::value, "");
static_assert(std::is_same<decltype(c), success<const char *>>::value, "");
static_assert(std::is_same<decltype(d), success<int>>::value, "");
static_assert(std::is_same<decltype(e), success<void>>::value, "");
static_assert(std::is_same<decltype(f), success<const char *>>::value, "");
return 0;
}
令我惊讶的是,success()
不会编译,但success{}
会编译。我已经提供了模板推理指南success() -> success<void>
,所以我认为success()
也可以。
这是 C++ 17 标准的预期行为,还是我错过了什么?
这是一个gcc错误(刚刚提交81486(。在推导success()
时,我们合成一个重载集,它包括:
// from the constructors
template <class T> success<T> foo(T&& ); // looks like a forwarding reference
// but is really just an rvalue reference
template <class T> success<T> foo(T const& );
// from the deduction guides
template <class T> success<T> foo(T ); // this one is a bit redundant
success<void> foo();
并确定返回类型,就好像它被调用为foo()
一样,这当然应该给你一种success<void>
。它不是一个错误。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用在用于SFINAE的void_t中具有参数的方法
- 用于检查值是否为其任何参数的帮助程序函数
- 为什么可变参数函数不适用于模板
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 一个模板方法,用于同时接受常量和非常量参数
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 使用一个参数的模板函数时出错(适用于 2)
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- 隐式生成的函数重载用于右值参数?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 将非 const 对象用于 const 参数
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 用户定义的转换不适用于可变参数函数参数?为什么不呢?
- 如何修复用于根据参数返回不同类型的模板类中的错误C2679?
- 用于接收通用地图作为参数的模板函数
- SFINAE 用于具有默认参数的函数对象
- C++具有可变参数专用参数的模板,用于参数数量
- 在C++函数 WriteFile 和 ReadFile 中用于参数 LPVOID lpBuffer 的变量类型
- 如何动态地确定用于参数化模板的类型并对它们进行比较