【问题标题】:boost::make_optional with type specificationboost::make_optional 类型说明
【发布时间】:2021-04-02 07:46:00
【问题描述】:

我对与模板规范一起使用时的 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))

工作正常。

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

谢谢!

【问题讨论】:

  • std::make_optional的想法是让演绎发生...
  • 正如我在问题中所写,我已经知道这一点..
  • “但我正在阅读一些使用这种结构的代码。” 这些代码是“错误的”。
  • 我认为你是对的。但它帮助我学习了这种语言的一个新特性;)

标签: c++ boost boost-optional


【解决方案1】:

boost::make_optional 的模板参数没有在 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&amp; 用于 l 值,int 用于 r 值。

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

当您指定类型时,您将强制参数为 int &amp;&amp;,它与 int&amp; 不匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多