使用构造函数部分推导参数

Partially deduce arguments with constructor

采取以下class (C++17)

#include <variant>
template <typename Error, typename T>
class Optional
{
public:
    constexpr Optional(T&& value)
    : m_variant(std::forward<T>(value))
    {}

private:
    std::variant<Error, T> m_variant = Error{};
};

template <typename E, typename T>
Optional<E, T> MakeOptional(T&& val) { return Optional<E, T>{val}; }

enum class Error
{
    ERROR,
    OTHER_ERROR,
};

下面编译就好了

Optional<Error, int> opt1{4};
auto opt3 = MakeOptional<Error>(7);

但这并不

Optional<Error> opt2{4}; // does not compile "too few template arguments for class template 'Optional'"

上面的代码可以通过编译吗?它应该能够像 MakeOptional() 那样使用构造函数的参数推导出第二个模板参数。

CTAD 是“全有或全无”。

note

Class template argument deduction is only performed if no template argument list is present. If a template argument list is specified, deduction does not take place.