52得票1回答
为什么C++20中弃用了volatile关键字?

根据cppreference,C++20中大多数使用volatile关键字的用法都将被弃用。那么volatile的缺点是什么?在不使用volatile时有哪些替代解决方案?

52得票2回答
为什么C++20中的std::move不是[[nodiscard]]?

我最近了解到C++17中的[[nodiscard]],据我所知它是一项新功能(设计合同?),它强制你使用返回值。这对于像std::launder这样备受争议的函数来说是有意义的(自C++20以来变成nodiscard),但我想知道为什么std::move在C++17/20中没有被定义为这样的特...

52得票4回答
为什么在C++20中如果构造函数被显式默认或删除,聚合初始化不再起作用?

我正在将一个C++的Visual Studio项目从VS2017迁移到VS2019。现在我遇到了一个之前没有出现过的错误,可以通过以下代码几行来复现:struct Foo { Foo() = default; int bar; }; auto test = Foo { 0 };...

51得票2回答
C++20比较:关于模糊的反向运算符的警告

考虑这个有效的C++17示例: struct A { bool operator==(const A&); }; int main() { return A{} == A{}; } 当使用clang并加上-std=c++20编译时,会得到以下结果: <so...

50得票2回答
为什么双重否定会改变C++概念的值?

我的一个朋友向我展示了一个使用概念的C++20程序,让我感到困惑: struct A { static constexpr bool a = true; }; template <typename T> concept C = T::a || T::b; template &...

50得票6回答
C++20带有u8、char8_t和std::string的新特性

C++11引入了用于UTF-8字面量的u8前缀,几年前我认为这很酷,并在我的代码中添加了类似以下的东西:std::string myString = u8"●"; 这一切看起来都很好,但问题在于在C++20中,它似乎不能编译,因为u8创建了一个char8_t*,这与std::string不兼容...

50得票1回答
C++20 std::common_reference 的目的是什么?

C++20 引入了 std::common_reference。它的作用是什么?能否举个使用例子?

49得票3回答
如何在if-else语句中使用C++20的likely/unlikely属性

这个问题涉及到C++20的[[likely]]/[[unlikely]]特性,而不是编译器定义的宏。 这份文档(cppreference)只提供了将它们应用于switch-case语句的示例。这个switch-case示例在我的编译器(g++-7.2)上完美编译,所以我认为编译器实现了这个特...

48得票2回答
重写比较运算符引起了哪些破坏性变化?

在C++20中,有一些关于重写比较运算符的新规则,我正在努力理解它们如何工作。我遇到了以下程序:struct B {}; struct A { bool operator==(B const&); // #1 }; bool operator==(B const&...

47得票3回答
C++20三路比较带来更多的静默行为变化

让我感到惊讶的是,我遇到了另一个问题,类似于 C++20行为破坏现有代码等于运算符?。 考虑一个简单的不区分大小写的键类型,可用于例如std::set或std::map:// Represents case insensitive keys struct CiKey : std::string...