auto Lambda=[](auto& opt) {
opt=<default constructor of opt::value_type>;
};
std::optional<std::string> optstr;
Lambda(optstr);
std::optional<int> optint;
Lambda(optint);
在这里,我希望Lambda
能够初始化opt
...但是我不能说std::string()
,因为那样的话,当用int
调用时错误。
我尝试过decltype
,但无法编译。
答案 0 :(得分:2)
您可以使用:
auto temp = typename std::decay_t<decltype(opt)>::value_type{};
在您的lambda内。或者:
auto temp = typename std::remove_cvref_t<decltype(opt)>::value_type{};
在C ++ 20中。
仅 decltype(opt)
无效,因为您通过引用传递了opt
,因此其类型是对std::optional
的引用。因此,您需要从结果类型中删除该引用,以访问std::optional
本身,然后访问其value_type
。
与以下代码相同:
std::optional<int>& o;
decltype(o)::value_type i{}; // error
甚至:
std::optional<int>&::value_type i{}; // error