boost::make_optional 有类型说明

boost::make_optional with type specification

我对 boost::make_optional() 与模板规范一起使用时的行为感到困惑。

特别是,我仍然不清楚为什么会这样:

int pizza = 5;
boost::optional<int> pizza_opt = boost::make_optional<int>(pizza)

抛出编译错误无法将“int&&”类型的右值引用绑定到“int”类型的左值;而这个:

int foo(int bar)
{ return bar; }

boost::optional<int> pizza_opt = boost::make_optional<int>(foo(pizza))

工作正常。

我已经从 知道使用 boost::make_optional 指定类型没有多大意义,但我正在阅读一些确实使用这种结构的代码。

谢谢!

boost::make_optional 的模板参数没有在可选的内部准确定义类型。

此模板参数负责完美转发,这里是简单的最小示例重现问题:

#include <iostream>

template<typename T>
void bar(T&& x)
{
    std::cout << __PRETTY_FUNCTION__ << " " 
        << std::forward<T>(x) << '\n';
}

int foo(int x)
{
    return x + 1;
}

int main()
{
    int pizza = 5;
    bar(pizza);
    bar<int>(foo(pizza));
    // bar<int>(pizza); // same error

    return 0;
}

Live demo.

因此,当推导完成后,左值的 T 为 int&,右值的 T 为 int

当你传递变量时,你传递的是左值。

当您指定类型时,您强制参数为 int &&,这与 int&.

不匹配