- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是 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/
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: What is the difference between is_convertible is_assign
我正在努力适应一些 tmp 概念。 这是检查 2 种类型是否可分配的一种解决方案:这是最重要的部分: template class __is_assignable_helper: public __s
刚刚来自is_assignable and std::unique_ptr . @Angew 告诉我,因为 std::unique_ptr和 std::unique_ptr是不同的类型,所以 stat
这是 std::is_assignable 的实现,我花了几个小时试图了解它如何静态地找出模板化对象的类型,但没能成功。 在标准中is_assignable指出分配的两边都转换为 std::add_r
is_convertible 和 is_assignable 有什么区别? 为什么, 在 vs2012 中 is_convertible is false is_assignable is true
Here是来自 gcc 的测试文件,live demo struct do_nothing { template void operator()(T*) {} }; int main
std::is_assignable::value == false在一致的实现中(例如 clang/libc++、gcc/libstdc++,但不是 VS2012)。 直觉上,这意味着像 int x
我在尝试使用 std::is_assignable 进行推断时遇到了一个小问题 我的代码: #include #include class Object{}; enum my_conv { s
更具体的原因 std::is_assignable_v 也给出了 false。) 请注意: struct Structure {}; std::is_assignable::value;会返回 tr
给定两个非常简单的类: class X { }; class Y : public X { }; 为什么会这样,使用 Clang 和 GCC targeting C++14 , std::is_ass
希望问题从问题中显而易见:)如果不是,请考虑以下代码: template class test { public: test(std::string &v) : val(v) {}
我想弄清楚如何在 is_assignable 的实现中解释 declval() = declval()。 declval 将类型转换为引用。鉴于此,我将表达式转换为以下四种可能性之一: _Dest&&
正如预期的那样,以下代码 does not compile . #include #include int main() { using T = std::pair; const
以下表达式使用 is_assignable返回 true使用 gcc 4.7 和 boost 1.49 时: typedef boost::function F; std::is_assignable
在 VS2017 中切换到 LLVM 工具集以使用 Boost 1.68 构建代码时,我收到以下构建错误。使用 MSVC 编译器可以很好地构建代码。 1>C:\boost_1_68_0\boost/t
我是一名优秀的程序员,十分优秀!