请考虑以下简化示例,也可以在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 …Run Code Online (Sandbox Code Playgroud)