【问题标题】:Default value of function parameter initialized by list initialization列表初始化函数参数的默认值
【发布时间】:2017-11-19 04:00:54
【问题描述】:

谁能帮我解决以下问题?

有一个简单的代码:

#include <vector>

struct A {
    std::vector<int> vec;
};

void func (A &&a = {}) {}

int main()
{
    func();
    return 0;
}

当我尝试通过 gcc 5.4.0 编译它时,我得到了错误:

undefined reference to `std::vector<int, std::allocator<int> >::vector()'

很神奇,但是 clang 编译得很好。 另外,如果稍微修改一下代码,编译时没有任何问题:

#include <vector>

struct A {
    std::vector<int> vec;
};

void func (A &&a) {}

int main()
{
    func({});
    return 0;
}

我真的不明白第一个代码有什么问题。

【问题讨论】:

  • 能否提供用于编译的命令行?你在用 g++ 吗?
  • 可能与this bug report的原因相同
  • 如果将vector 替换为list(或我想的任何其他模板化容器),也会出现同样的问题。
  • @NathanOliver 这确实是答案。请写下来。
  • 这实际上不是矢量问题:wandbox.org/permlink/7ZZrMnzOUX6hdOxb

标签: c++ c++11 list-initialization aggregate-initialization


【解决方案1】:

这是gcc bug。也可以用

复制
template<typename Value>
struct A
{
    A() = default;
    std::vector<Value> m_content;
};

void func(A<int> a = {})
{
}

int main()
{
    func();
}

不过,目前还没有任何状态。

我似乎缺少向量的实际实例导致编译器没有为它删除代码,从而导致未定义的引用。

【讨论】:

    【解决方案2】:

    正如@NathanOliver 提到的,这是一个 GCC 错误。什么是错误?在我看来,当它用作函数参数并包含在另一种类型中时,它忘记实例化一个类std::vector&lt;int&gt;
    您可以通过在代码中的其他位置使用 A 来解决它。即使是一个简单的声明就足够了。它强制编译器实例化模板类型,你很好。在下面将编译的代码中查找未使用的

    #include <vector>
    
    struct A {
        std::vector<int> vec;
    };
    
    void func (A &&a = {}) {
        A unused;
    }
    
    int main()
    {
        func();
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 1970-01-01
      • 2021-11-27
      • 2014-05-06
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多