【问题标题】:Return initializer list instead of vector in std::function在 std::function 中返回初始化列表而不是向量
【发布时间】:2016-10-20 02:23:13
【问题描述】:

编辑: 它不与链接的问题重复(这也是我的)。这里所有的返回类型都是std::vector。我不想 返回initializer-list。我要填写退回的 std::vector initializer-list 直接

让我们来看看这四种情况:

1)

//Acceptable
std::vector<int> foo(){
    return std::vector<int>{1}; 
}

2)

//Acceptable
std::vector<int> foo(){
    return {1};    
}

3)

//Acceptable
std::function<std::vector<int>()> foo=[](){
    return std::vector<int>{1}; 
};

4)

//NOT Acceptable
std::function<std::vector<int>()> foo=[](){
    return {1}; 
};

既然 2 可以接受,为什么 4 不可接受?他们之间有什么不同?而且,最奇怪的是这是可以接受的:

//Acceptable
auto  bar=[]()->std::vector<int>{
    return {1}; 
};

std::functioninitializer-list 有什么问题?

【问题讨论】:

  • 在我 Mjölnir 之前:链接的答案如何在你眼中没有回答这个问题?
  • 不一样。关于返回 Initializer-list 的问题。这里所有情况下的返回类型都是向量。
  • 返回类型无关紧要。重点是不能自动推导出类型,需要手动指定。
  • @nwp 这不认为是手动指定吗? "std::function<:vector>()>"

标签: c++ c++11 vector initializer-list std-function


【解决方案1】:

auto bar=[]()-&gt;std::vector&lt;int&gt;{ 指定 lambda bar 的返回类型为 std::vector&lt;int&gt;

std::function&lt;std::vector&lt;int&gt;()&gt; foo=[](){没有指定foo的返回类型,因为你先推导出lambda的返回类型,然后赋值。

在决定类型时,C++ 没有考虑您可以将 lambda 分配给什么,它看到返回 {1},这是一个 std::initializer_list&lt;int&gt;,它与 std::function&lt;std::vector&lt;int&gt;&gt; 不兼容。

【讨论】:

    【解决方案2】:

    (4) 中 lambda 的返回类型是 auto,而不是 (2) 中的 std::vector 和上一个示例,您仍在使用 lambda,但强制返回类型。

    return {1} 中扣除auto 得到std::initializer_list&lt;int&gt;(),这与std::function 所期望的std::vector&lt;int&gt;() 不同。

    【讨论】:

    • “auto 的扣除返回 {1} 导致 std::initializer_list()”auto a={1}; 中的 a 成为初始化列表这一事实并不意味着 []{return {1};}initializer_list 推导出为返回类型。
    【解决方案3】:

    这个变体编译:

    std::function<std::vector<int>()> foo=[]()->std::vector<int>{
        return {1}; 
    };
    

    这与您的情况 4 相同,除了 lambda 表达式中的显式返回类型。这表明std::function&lt;&gt; 声明的类型不会传播到 lambda 表达式的解析中; lambda 的解析独立于周围的表达式。

    我不确定这是 C++ 语言标准的一个特性还是现实世界编译器的限制(我用 g++ -std=c++11 测试过),因为我不是一个语言律师.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多