具有初始化的Vector <int>工厂不起作用

Rad*_*ača 2 c++ clang visual-studio

我试图创建一个向量工厂,该工厂创建一个1具有指定大小的值的向量,s但无法按预期工作。

template<size_t s>
constexpr std::vector<int>& vector_factory()
{
    std::vector<int> v(s, 1);
    return v;
}


int main(int argc, char* argv[])
{
    constexpr size_t s = 10;
    std::vector<int> v1 = vector_factory<s>();
    std::vector<int> v2 = vector_factory<s>();
}
Run Code Online (Sandbox Code Playgroud)

由于分配尝试过多,导致出现运行时错误。但是,如果我尝试以这种方式实现它,则它可以正常工作。

constexpr size_t s = 10;
std::vector<int> v1(s, 1);
std::vector<int> v2(s, 1);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

lub*_*bgr 9

运行时错误不是由于尝试进行大量分配,而是由于两个悬挂的引用。功能签名

constexpr std::vector<int>& vector_factory();
Run Code Online (Sandbox Code Playgroud)

有两个问题。首先,由于std::vector没有constexpr构造函数,因此无法编译。其次,必须按值而不是引用返回对象。编译器甚至应就此问题警告您。如果您将以上内容更改为

std::vector<int> vector_factory() { /* As before... */ }
Run Code Online (Sandbox Code Playgroud)

一切都会按预期进行。

  • @RadimBača,来自您的链接:“ ...声明可以在编译时评估函数或变量的值”。声明它并不意味着它确实有可能,你不能`constexpr`构造一个向量 (2认同)