gpt4 book ai didi

C++ 自动折叠规则

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:27 25 4
gpt4 key购买 nike

标准是否说明此代码将如何运行?

注意:在编译时不可能知道下面评估的值条件是什么。

生成的代码会有两条路径吗?一种是当条件为真时 v 折叠为右值,另一种是当条件为假时 v 将是左值。

或者是假设最坏的情况并且 v 在这两种情况下都崩溃为左值?

或者它只是实现定义的?

struct SomeClass { std::vector<std::string> vec_member_; };

void f(const SomeClass& d, bool condition) {
auto&& v = (condition) ?
std::vector<std::string>{ "fallback case" }
: d.vec_member_;
for(auto&& e : v) {
... // operate on e (Read only)
}
}

抱歉格式化。我使用 android 进行编辑,但无法在编辑后修复代码部分。

最佳答案

C++ 中的表达式有类型。这包括 ?:表达式。

你的 ?:表达式的类型是 std::vector<std::string>const . const来自您正在访问 d.member 的事实而右值来自于 ? 的一个分支这一事实其中有一个纯右值。

演示这一点的完整编译代码:

struct SomeClass {
std::vector<std::string> vec_member_;
};
void f(bool condition, const SomeClass& d) {
static_assert(
std::is_same_v<
decltype((condition) ? std::vector<std::string>{ "fallback case" } : d.vec_member_),
std::vector<std::string>const
>
);
auto&& v = (condition) ? std::vector<std::string>{ "fallback case" } : d.vec_member_;
for(auto&& e : v) {
(void)e;
}
}

auto&&v变成 std::vector<std::string> const&& .对于成员变量,它绑定(bind)到一个拷贝。对于右值,它被省略到临时实体化以绑定(bind)到右值引用 v .

Live example .

关于C++ 自动折叠规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58063781/

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