小编康桓瑋*_*康桓瑋的帖子

为什么 volatile 在 C++20 中被弃用?

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

c++ volatile c++20

33
推荐指数
1
解决办法
4987
查看次数

C++23中省略参数列表的lambda表达式的有效性

根据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++ lambda language-lawyer c++23

30
推荐指数
1
解决办法
1293
查看次数

26
推荐指数
1
解决办法
541
查看次数

为什么我们不能专门化概念?

适用于类的语法不适用于概念:

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

为什么概念不能专门化?有理论上的原因吗?

c++ template-specialization c++-concepts c++20

25
推荐指数
3
解决办法
3198
查看次数

在 C++20 中使用 lambda 进行参数包扩展

案例一

考虑 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)

这次三个编译器拒绝了相同的错误信息: …

c++ lambda language-lawyer variadic-templates c++20

21
推荐指数
1
解决办法
392
查看次数

为什么 range::for_each 返回该函数?

传统的std::for_each返回函数作为标准需要根据[alg.foreach]Function满足Cpp17MoveConstructible

\n
\n
template<class InputIterator, class Function>\n  constexpr Function for_each(InputIterator first, InputIterator last, Function f);\n
Run Code Online (Sandbox Code Playgroud)\n

前提条件Function满足Cpp17MoveConstructible要求。

\n

[注意:\xe2\x80\x82Function不需要满足Cpp17CopyConstructible的要求。尾注]

\n
\n

这是合理的,因为用户可能希望在调用后重用该函数。

\n

的并行版本for_each没有返回:

\n
\n
template<class ExecutionPolicy, class ForwardIterator, class Function>\n  void for_each(ExecutionPolicy&& exec,\n                ForwardIterator first, ForwardIterator last,\n                Function f);\n
Run Code Online (Sandbox Code Playgroud)\n

前提条件Function满足Cpp17CopyConstructible要求。

\n
\n

这是因为标准要求Function满足Cpp17CopyConstructible,因此不需要返回该函数,因为用户可以根据需要在调用方自由创建副本。

\n

我注意到ranges::for_each …

c++ language-design language-lawyer c++20 std-ranges

20
推荐指数
2
解决办法
1769
查看次数

固定宽度整数类型的整数文字

对于像这样的固定宽度整数类型的整数文字是否有一些 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)

c++ c++11

19
推荐指数
1
解决办法
917
查看次数

我们真的需要将范围适配器隐式转换为 bool 吗?

由于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++ c++20 std-ranges

19
推荐指数
1
解决办法
405
查看次数

范围适配器的开始/结束的常量过载是否受到限制?

在 C++20 中,某些范围同时具有const和 non- const begin()/end(),而其他范围仅具有 non- const begin()/end()

\n

为了使包装前者的范围适配器能够begin()/end()在合格时使用const,一些范围适配器如elements_viewreverse_viewcommon_view都提供了 constrainedconst合格的begin()/end()函数,例如:

\n
 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)

c++ language-lawyer c++20 std-ranges

17
推荐指数
1
解决办法
699
查看次数

在模板 lambda 中隐式捕获 const 变量,而未指定捕获默认值

考虑以下代码:

auto f() {
  const auto x = 1;
  return [] (auto) { return x; };
}
Run Code Online (Sandbox Code Playgroud)

GCC 和 MSVC 编译得很好,但 Clang 拒绝了它。我应该信任哪个编译器?那是 Clang 尚未实现的编译器扩展还是只是 Clang 错误?

c++ lambda language-lawyer c++17 c++20

16
推荐指数
2
解决办法
454
查看次数