【发布时间】:2016-07-11 03:27:17
【问题描述】:
我想知道如何解决对std::make_optional 这两个重载的调用:
template< class T >
constexpr std::optional<std::decay_t<T>> make_optional( T&& value );
template< class T, class... Args >
constexpr std::optional<T> make_optional( Args&&... args );
我知道没有像make_optional(123) 这样的显式模板参数的调用会调用第一个,但是make_optional<int>(123) 呢?将选择哪个重载,按照什么规则?
更新:如果我写make_optional<string>("hello world"),我将调用第二个重载(即使字符串文字可以隐式转换为string),对吗?
【问题讨论】:
-
库(和命名空间)在哪里声明它们?
std::experimental似乎只定义了第一个。 -
@Nawaz:
make_optional的第二个重载来自P0032 (PDF),显然是forwarded to LWG before Oulu。虽然 P0091 可能会使它过时,但他们可能没有采用它。所以目前,Nawaz 是正确的:第二个重载不存在。 -
@NicolBolas It exists.
-
@Nawaz 我在en.cppreference.com/w/cpp/utility/optional/make_optional看到了他们。
标签: c++ templates c++11 c++14 c++17