gpt4 book ai didi

c++ - libc++ 的 std::is_literal_type 是如何工作的?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:41 37 4
gpt4 key购买 nike

这与 std::is_literal_type 的情况相同和 std::is_standard_layout .

执行std::is_literal_type在 libc++ 中是

template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_literal_type
#ifdef _LIBCPP_IS_LITERAL
: public integral_constant<bool, _LIBCPP_IS_LITERAL(_Tp)>
#else
: integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value ||
is_reference<typename remove_all_extents<_Tp>::type>::value>
#endif
{};

没有_LIBCPP_IS_LITERAL , 所以代码将是

template <typename T> struct is_literal_type : integral_constant<bool,
is_scalar<typename remove_all_extents<T>::type>::value or
is_reference<typename remove_all_extents<T>::type>::value> {};

我写了一个演示:

#include <iostream>

using namespace std;
struct s {
int a;
char b;
long c;
};
int main(int argc, char *argv[]) {
cout << boolalpha;
cout << is_scalar_v<typename remove_all_extents<s>::type> << endl;
cout << is_reference_v<typename remove_all_extents<s>::type> << endl;
}

结果是falsefalse .但是 is_literal_type_v<s> 的结果是true .

谁能解释一下如何std::is_literal_type有用吗?

最佳答案

is_literal_type 是一个“神奇”的 C++ 库。它不能像当前的语言一样用 C++ 实现(使用静态反射,它应该是可能的,但最快是 C++23)。它是通过使用特定于编译器的内部工具来实现的,而不是直接使用 C++。 _LIBCPP_IS_LITERAL 可能是由编译器定义的宏(因此它看起来未定义),它表示特定的编译器内在。

因此,您真的不应该太仔细地研究这个或许多其他类型特征的实现。

我认为未定义 _LIBCPP_IS_LITERAL 的版本是为了与未公开必要内在函数的旧版本编译器兼容。因此,库实现在没有编译器支持的情况下尽其所能。

关于c++ - libc++ 的 std::is_literal_type 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53970627/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com