C++17 评估顺序保证 (P0145) 中的投票对典型 C++ 代码有何影响?
它对以下内容有何改变?
i = 1;
f(i++, i)
和
std::cout << f() << f() << f();
或者
f(g(), h(), j());
原文由 Johan Lundberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
C++17 评估顺序保证 (P0145) 中的投票对典型 C++ 代码有何影响?
它对以下内容有何改变?
i = 1;
f(i++, i)
和
std::cout << f() << f() << f();
或者
f(g(), h(), j());
原文由 Johan Lundberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
到目前为止,评估顺序尚未 指定 的一些常见情况已通过
C++17
指定并有效。一些未定义的行为现在是未指定的。struct Speaker{ int i =0; Speaker(std::vectorstd::string words) :words(words) {} std::vectorstd::string words; std::string operator()(){ assert(words.size()>0); if(i==words.size()) i=0; // Pre-C++17 version: auto word = words[i] + (i+1==words.size()?”\n”:“,”); ++i; return word; // Still not possible with C++17: // return words[i++] + (i==words.size()?“\n”:“,”);
};
int main() { auto spk = Speaker{{“All”, “Work”, “and”, “no”, “play”}}; std::cout << spk() << spk() << spk() << spk() << spk() ; }
play no,and,Work,All,
All,work,and,no,play
(((((std::cout << spk()) << spk()) << spk()) << spk()) << spk()) ;
f(std::unique_ptr a, std::unique_ptr b);
f(get_raw_a(), get_raw_a());
”`
如果其中一个调用
get_raw_a()
会在另一个原始指针绑定到其智能指针参数之前抛出,则会泄漏。正如 TC 所指出的,该示例存在缺陷,因为从原始指针构造 unique_ptr 是显式的,因此无法编译。 *
还要注意这个经典 问题(标记为 C ,而不是 C++ ):
仍然未定义。