【发布时间】: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() >= 2U};检查表达式在语法上是否正确,而不是max_size真的超过 2。std::is_arithmetic_v<typename A::value_type> == true也是如此。 -
@Const 我确信
if constexpr也适用于正常功能。如果我将b替换为括号中的false,则不会打印该句子。 -
@某程序员老兄 跟命名无关,是练C++20..
-
所以这更多的是出于好奇而不是试图解决一个真正的问题?然后请将其包含在问题本身中。否则,我建议您尝试直接询问问题(并包括所有要求和限制,并提及此概念作为您解决问题的尝试)。
标签: c++ c++20 c++-concepts if-constexpr