小编Fei*_*ims的帖子

对于“concept A = ...;”,“requires A”和“requires (A)”应该相同吗?

讨论首先在llvm/llvm-project#60377进行。一遍又一遍地阅读temp.constr.atomictemp.constr.normal后,由于我的英语很差,我对这个问题感到更加困惑。

就像下面的例子一样,为了帮助 clang-format 正确格式化 require 子句,我曾经添加了一对括号。现在我改变了我的风格。当我尝试更改代码时,发生了意外错误。

#include <concepts>

template <typename T>
  requires std::integral<T>
struct [[nodiscard]] Widget;

template <typename T>
  requires(std::integral<T>)  // error: Requires clause differs
struct [[nodiscard]] Widget {
  T value;
};

[[nodiscard]] auto main() -> int {
  Widget<int> widget{1};
  return widget.value;
}
Run Code Online (Sandbox Code Playgroud)

我用不同的编译器对此进行了测试。事实证明:

根据标准、clang/msvc 或 gcc,预期行为是什么?

c++ language-lawyer c++-concepts c++20

5
推荐指数
1
解决办法
131
查看次数

在定义概念时使用“and”而不是“&amp;&amp;”有什么好处?

我发现一些 CppCon 演讲者使用and而不是&&定义概念并用于&&“正常”布尔表达式,但我无法弄清楚这样做的好处。

我能找到的关于概念命名约定的唯一材料是P1851:snake_case 概念命名指南,但它对此只字未提。

谁能告诉我为什么?

例子:

template <typename T>
concept boolean_testable
    = std::convertible_to<T, bool>
      and requires(T&& t) {
            { !std::forward<T>(t) } -> std::convertible_to<bool>;
          };
Run Code Online (Sandbox Code Playgroud)

代替:

template <typename T>
concept boolean_testable
    = std::convertible_to<T, bool>
      && requires(T&& t) {
           { !std::forward<T>(t) } -> std::convertible_to<bool>;
         };
Run Code Online (Sandbox Code Playgroud)

&&虽然和之间的完全可替代性and引起了我的注意,但我仍然无法弄清楚为什么有些程序员故意选择and 仅在定义概念时使用。我注意到它们仍在其他上下文中使用&&(布尔表达式,T&&...)。我无法弄清楚他们从这种风格中得到了什么好处。

and我不是在问和之间的区别,而是在概念定义中使用而不是仅&&概念定义中使用的动机。据我所知,没有重复的问题。and&&

c++ naming-conventions concept c++20

3
推荐指数
1
解决办法
206
查看次数