根据cppreference,volatile关键字的大多数用法在 C++20 中将被弃用。的缺点是volatile什么?不使用时的替代解决方案是什么volatile?
根据cppreference,gcc 和 clang 最近都完成了P1102R2(“ Down with ()!”)的实现,这意味着我们可以在 C++23 中更简洁地定义 lambda 表达式。
但是我发现它们与某种形式不一致:
auto l = []<auto> noexcept requires true {};
Run Code Online (Sandbox Code Playgroud)
clang 接受这种形式,而 gcc拒绝其语法。
我应该信任哪个编译器?这个 lambda 在 C++23 中是格式正确还是格式错误?
或许是迫于舆论压力,clang在我举报后的五天内迅速修复了49736。
再进一步尝试时,无意中发现gcc也拒绝了以下有效表单,这让我报告了99850,2周后修复。
auto l = []<auto> requires true -> void {};
Run Code Online (Sandbox Code Playgroud) C ++ 20引入std::common_reference。目的是什么?有人可以举一个使用它的例子吗?
适用于类的语法不适用于概念:
template <class Type>
concept C = requires(Type t) {
// ...
};
template <class Type>
concept C<Type*> = requires(Type t) {
// ...
};
Run Code Online (Sandbox Code Playgroud)
MSVC 对于“专业化”行的说法是:error C7606: 'C': concept cannot be explicitly instantiated, explicitly specialized or partially specialized。
为什么概念不能专门化?有理论上的原因吗?
案例一:
考虑 lambdanoexcept说明符中的以下包扩展:
template <bool... B>
auto g() {
([]() noexcept(B) {}, ...);
}
Run Code Online (Sandbox Code Playgroud)
Clang 和 MSVC 接受此代码,但 GCC拒绝:
error: expansion pattern '<lambda>' contains no parameter packs
Run Code Online (Sandbox Code Playgroud)
这是一个有效的代码吗?我应该信任哪个编译器?它看起来像是与PR 47226相关的旧 GCC 错误。
案例2:
考虑 lambda 中的以下包扩展requires-clause:
template <bool... B>
auto g() {
([](auto) requires(B) {}, ...);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Clang 和 MSVC 仍然接受此代码,而 GCC以相同的错误消息拒绝它。这只是同一个错误吗?
案例3:
考虑 lambda 模板列表中的以下包扩展:
template <typename... Args>
void g(Args...) {
([]<Args>(){}, ...);
}
Run Code Online (Sandbox Code Playgroud)
这次三个编译器都拒绝了相同的错误信息: …
传统的std::for_each返回函数作为标准只需要根据[alg.foreach]Function满足Cpp17MoveConstructible:
\n\nRun Code Online (Sandbox Code Playgroud)\ntemplate<class InputIterator, class Function>\n constexpr Function for_each(InputIterator first, InputIterator last, Function f);\n前提条件:
\nFunction满足Cpp17MoveConstructible要求。[注意:\xe2\x80\x82
\nFunction不需要满足Cpp17CopyConstructible的要求。尾注]
这是合理的,因为用户可能希望在调用后重用该函数。
\n的并行版本for_each没有返回:
\n\nRun Code Online (Sandbox Code Playgroud)\ntemplate<class ExecutionPolicy, class ForwardIterator, class Function>\n void for_each(ExecutionPolicy&& exec,\n ForwardIterator first, ForwardIterator last,\n Function f);\n前提条件:
\nFunction满足Cpp17CopyConstructible要求。
这是因为标准要求Function满足Cpp17CopyConstructible,因此不需要返回该函数,因为用户可以根据需要在调用方自由创建副本。
我注意到ranges::for_each …
对于像这样的固定宽度整数类型的整数文字是否有一些 c++ 建议?
// i's type is unsigned int
auto i = 10u;
// j's type is uint32_t
auto j = 10u32;
Run Code Online (Sandbox Code Playgroud) 由于ranges::view_interface有一个explicit operator bool()函数,这使得大多数 C++20 范围适配器能够转换为bool:
https://godbolt.org/z/ccbPrG51c
static_assert(views::iota(0));
static_assert("hello"sv | views::split(' '));
static_assert(views::single(0) | std::views::transform([](auto) { return 0; }));
Run Code Online (Sandbox Code Playgroud)
虽然这看起来很方便,但我们真的需要这个功能吗?原因是传统的STL容器比如std::vector,或者常用的视图比如std::string_view,没有这个转换为 的功能bool,看起来有些不协调。只是调用.empty()或ranges::empty直接确定范围是否为空似乎更直观。
此外,这种隐式转换也可能会引起混淆:
static_assert(!views::empty<int>);
Run Code Online (Sandbox Code Playgroud)
那么,为什么ranges::view_interface提供这个operator bool功能呢?有没有实际的用例?
请注意,这可能是一个基于意见的问题,但我想知道view_interface提供operator bool.
在 C++20 中,某些范围同时具有const和 non- const begin()/end(),而其他范围仅具有 non- const begin()/end()。
为了使包装前者的范围适配器能够begin()/end()在合格时使用const,一些范围适配器如elements_view、reverse_view和common_view都提供了 constrainedconst合格的begin()/end()函数,例如:
template<view V>\n requires (!common_\xc2\xadrange<V> && copyable<iterator_t<V>>)\n class common_view : public view_interface<common_view<V>> {\n public:\n constexpr auto begin();\n constexpr auto end();\n\n constexpr auto begin() const requires range<const V>;\n constexpr auto end() const requires range<const V>;\n};\n\ntemplate<input_\xc2\xadrange V, size_t N>\n requires view<V> && has-tuple-element<range_value_t<V>, N>\nclass elements_view : public view_interface<elements_view<V, N>> {\n public:\n constexpr …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
auto f() {
const auto x = 1;
return [] (auto) { return x; };
}
Run Code Online (Sandbox Code Playgroud)
GCC 和 MSVC 编译得很好,但 Clang 拒绝了它。我应该信任哪个编译器?那是 Clang 尚未实现的编译器扩展还是只是 Clang 错误?
c++ ×10
c++20 ×8
lambda ×3
std-ranges ×3
c++-concepts ×1
c++11 ×1
c++17 ×1
c++23 ×1
type-traits ×1
volatile ×1