gpt4 book ai didi

c++ - constexpr if 和返回值优化

转载 作者:行者123 更新时间:2023-12-01 00:09:14 25 4
gpt4 key购买 nike

我有这个代码:

#include <string>

class A {
public:
// A(A const &) = delete; // Code fails if this is uncommented.
explicit A(int);
explicit A(::std::string const &);

private:
::std::string myname_;
int foo_;
};

static constexpr bool which = false;

A test(::std::string const &s, int a)
{
if constexpr (which) {
A x{a};
return x;
} else {
A y{s};
return y;
}
}

如果 A,此代码将失败有一个删除的复制构造函数。但是,考虑到带有 if constexpr 的函数的返回类型规则在其中,编译器似乎应该在这里应用 RVO。

除了在语言规范中被忽视的情况之外,是否有其他原因?

最佳答案

这与if constexpr无关

简单地说,这段代码是不允许编译的:

class A {
public:
A(A const &) = delete;
explicit A(int);
};

A test(int a)
{
A x{a};
return x; // <-- error call to a deleted constructor `A(A const &) = delete;`
}

您正在考虑的 C++17 中的更改与 temporary materialization 有关并且不适用于 NRVO 因为 x不是纯右值。

例如,这段代码在 C++17 之前是非法的,现在是允许的:
A test(int a)
{
return A{a}; // legal since C++17
}

关于c++ - constexpr if 和返回值优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60405515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com