在 C++20 中使用类型名需要/概念吗?

2024-01-20

请考虑以下 C++20 程序:

#include <iostream>

template<typename T>
struct A {
    using X = typename T::X;
};

template<typename T>
constexpr bool WorksWithA = requires { typename A<T>; };

struct GoodArg {
    using X = int;
};

struct BadArg {
};

int main() {
    std::cout << WorksWithA<GoodArg> << std::endl;
    std::cout << WorksWithA<BadArg> << std::endl;
}

这是不是格式不正确?如果不是,输出应该是什么?

我期望输出是1 0但我在叮当声中观察到1 1。谁是对的,为什么?

$ clang++ --version
clang version 10.0.0-4ubuntu1 
$ clang++ test.cc -std=c++20
$ ./a.out 
1
1

这里的概念只是命名类型A<BadArg>,它不会执行任何操作来触发它的实例化。这里没有任何内容导致实例化A<BadArg>::X这将是不正确的。

If it did不过,那么你就不会得到false不管怎样,你会得到一个格式不正确的程序。例如,您是否完成了:

template<typename T>
constexpr bool WorksWithA = requires { A<T>{}; };

Then WorksWithA<BadArg>会触发实例化A<BadArg>它会尝试查找BadArg::X,现在在替代的直接背景之外是失败的。不是false,编译错误。

如果你想要一个结果false,你必须限制A现有类型的模板:

template <typename T>
    requires requires { typename T::X; }
struct A {
    using X = typename T::X;
};

现在两种配方(你原来的和我的替代品)都会产生false for WorksWithA<BadArg>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++20 中使用类型名需要/概念吗? 的相关文章

随机推荐