【问题标题】:How to properly use concepts?如何正确使用概念?
【发布时间】:2021-08-16 09:42:09
【问题描述】:

目前,我正在学习 C++,并决定从 C++20 开始。但是,这些代码让我发疯,因为我认为结果没有任何意义。

以下代码将打印句子Valid array.。我上面的意思是,这是不对的。它根本不应该打印句子,因为我在参数中插入的类型与概念不匹配。

在 VS2022 Preview 3 和 an online compiler 上使用最新的 GCC 和 C++2A(GNU) 参数进行测试,生成了相同的结果。

#include <array>
#include <cstdio>
#include <iostream>
#include <type_traits>

using namespace std;

template<typename A> concept ProperArray = requires(A array)
{
    {array.max_size() >= 2U};
    {std::is_arithmetic_v<typename A::value_type> == true};
};

int main()
{
    constexpr bool b = ProperArray<array<std::string, 1>>;
    if constexpr (b)
        cout << "Valid array." << endl;
        
    std::cout << "Hello, Wandbox!" << std::endl;
}

【问题讨论】:

  • 您应该将 constexpr 检查移至模板函数,它仅适用于模板函数。 main 不是模板函数。
  • 一方面,您使用了错误的需求类型。 {array.max_size() &gt;= 2U}; 检查表达式在语法上是否正确,而不是 max_size 真的超过 2。std::is_arithmetic_v&lt;typename A::value_type&gt; == true 也是如此。
  • @Const 我确信if constexpr 也适用于正常功能。如果我将b替换为括号中的false,则不会打印该句子。
  • @某程序员老兄 跟命名无关,是练C++20..
  • 所以这更多的是出于好奇而不是试图解决一个真正的问题?然后请将其包含在问题本身中。否则,我建议您尝试直接询问问题(并包括所有要求和限制,并提及此概念作为您解决问题的尝试)。

标签: c++ c++20 c++-concepts if-constexpr


【解决方案1】:

所以,有两件事。

  1. 您正在使用simple requirements(额外的{} 在技术上构成了这些复合要求,但由于您不使用这些的任何可选功能,因此它相当于一个简单的要求)。那些主要验证表达式在语法上是有效的。它的价值对他们来说无关紧要。你要的是nested requirements:

    template<typename A> concept ProperArray = requires(A array)
    {
        requires array.max_size() >= 2U;
        requires std::is_arithmetic<typename A::value_type>::value;
    };
    

    这些要求(其表达式必须是常量表达式),确实检查值。但是请注意,如果max_size 不是constexprconsteval 成员函数,或者如果评估不会产生常量表达式,那么这是一个硬错误。这个概念不会简单地是“错误的”。

  2. if constexpr 在模板之外是没有实际意义的。当它的条件依赖于模板参数的值时,它不会做同样的丢弃魔法。你可以使用普通的if 来达到同样的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多