gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:52 29 4
gpt4 key购买 nike

这是 std::is_assignable 的实现,我花了几个小时试图了解它如何静态地找出模板化对象的类型,但没能成功。

在标准中is_assignable指出分配的两边都转换为 std::add_rvalue_reference<T>::type .我不明白那句话,也不明白 std::add_rvalue_reference<T>::type可用于预测对象的类型。

谁能给我一个简单的解释,作为我理解 std::is_assignable 工作原理的第一步?

最佳答案

下面是删除了一些词法混淆的相同代码:

 1043     template <typename Tp, typename Up>
1044 class is_assignable_helper
1046 {
1047 template <typename Tp1, typename Up1>
1048 static decltype(declval<Tp1>() = declval<Up1>(), one())
1049 test(int);
1050
1051 template<typename, typename>
1052 static two test(...);
1053
1054 public:
1055 static constexpr bool value = sizeof(test<Tp, Up>(0)) == 1;
1056 };

这个类使用SFINAE做肮脏的工作。即变量value的值将取决于哪个test()根据重载决议选择功能。一个重载采用整数,另一个采用 C 可变参数(由省略号指定)。如果第一个重载发生替换失败,将选择第二个重载。

如果替换失败确实发生,它将来自表达式 declval<Tp1>() = declval<Up1>() . declval<T>()是一个函数声明,它“返回”类型为 std::add_rvalue_reference<T>::type 的值.此函数主要用于未评估的上下文,如 decltype() , sizeof() , noexcept()等,以便在不显式调用构造函数的情况下获取类型的实例(因为该类型可能没有可访问的构造函数)。如果您想知道为什么 add_rvalue_reference是选择的返回类型,参见 this post .

一旦获得该类型的实例,就可以在这些实例上调用成员/非成员函数。使用的成员函数是operator=() .如果一个类没有赋值运算符(或者有一个不可访问的运算符),就会出现替换失败。 test() 的后备(可变)版本将被选中。

参数类型不同的原因(int vs ...)是因为...具有最低的转换级别,它充当过载解决方案的“最后手段”。我们不能将参数留空,否则会出现重新声明错误。

至于test的返回类型- 如果替换失败没有发生(Up 类型的值可以分配给Tp 类型的值)那么test()返回一个指示成功的类型。如果确实发生替换失败,则选择返回指示失败的类型的回退版本。这些类型通过检查它们的大小来区分。我们通过与 1 比较来检查是否成功.

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

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