请考虑以下 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(使用前将#替换为@)