我仍然不明白
std::optional
在以下代码中:
class A
{
public:
// A(int x, int y) : x(x), y(y) {} // always compiles
private:
A(int x, int y) : x(x), y(y) {} // does not compile if using o.emplace(x, y)
friend std::optional<A> makeA(int x, int y);
int x, y;
};
std::optional<A> makeA(int x, int y)
{
std::optional<A> o;
if (x != 0 && y != 0) {
return A(x, y);
// o.emplace(x, y);
}
return o;
}
如果我让构造函数
A
作为公众在
makeA(...)
我可以用
return A(x, y)
或
o.emplace(x, y)
,两者都可以编译。
但如果我让构造函数
A.
那么私人
o.位置(x,y)
不会编译。据我从阅读模板错误消息中了解到:
error: no matching function for call to âstd::optional<A>::emplace(int&, int&)â
70 | o.emplace(x, y);
| ~~~~~~~~~^~~~~~
In file included from test.cpp:2:
/usr/include/c++/11/optional:871:9: note: candidate: âtemplate<class ... _Args> std::enable_if_t<is_constructible_v<_Tp, _Args ...>, _Tp&> std::optional<_Tp>::emplace(_Args&& ...) [with _Args = {_Args ...}; _Tp = A]â
871 | emplace(_Args&&... __args)
| ^~~~~~~
/usr/include/c++/11/optional:871:9: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/11/bits/move.h:57,
from /usr/include/c++/11/bits/stl_pair.h:59,
from /usr/include/c++/11/bits/stl_algobase.h:64,
from /usr/include/c++/11/memory:63,
from test.cpp:1:
/usr/include/c++/11/type_traits: In substitution of âtemplate<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = A&]â:
/usr/include/c++/11/optional:871:2: required by substitution of âtemplate<class ... _Args> std::enable_if_t<is_constructible_v<A, _Args ...>, A&> std::optional<A>::emplace<_Args ...>(_Args&& ...) [with _Args = {int&, int&}]â
test.cpp:70:14: required from here
/usr/include/c++/11/type_traits:2579:11: error: no type named âtypeâ in âstruct std::enable_if<false, A&>â
2579 | using enable_if_t = typename enable_if<_Cond, _Tp>::type;
| ^~~~~~~~~~~
In file included from test.cpp:2:
/usr/include/c++/11/optional:883:9: note: candidate: âtemplate<class _Up, class ... _Args> std::enable_if_t<is_constructible_v<_Tp, std::initializer_list<_Up>&, _Args ...>, _Tp&> std::optional<_Tp>::emplace(std::initializer_list<_Up>, _Args&& ...) [with _Up = _Up; _Args = {_Args ...}; _Tp = A]â
883 | emplace(initializer_list<_Up> __il, _Args&&... __args)
| ^~~~~~~
/usr/include/c++/11/optional:883:9: note: template argument deduction/substitution failed:
test.cpp:70:14: note: mismatched types âstd::initializer_list<_Tp>â and âintâ
70 | o.emplace(x, y);
班级
A.
不可构建。但这怎么可能呢?