奇怪的操作符?:与decltype一起使用
Strange operator ?: usage with decltype
我正在读一本书,这本书解释了c++的特征,并且有一个来自c++ type_traits头的例子,其中有一个奇怪的?:
用法,这里是相应的/usr/include/c++/…文件:
template<typename _Tp, typename _Up>
static __success_type<typename decay<decltype
(true ? std::declval<_Tp>()
: std::declval<_Up>())>::type> _S_test(int);
撇开给定声明的目的不谈,在这段代码中,?:
操作符的用法让我感到困惑。如果第一个操作数是true
,则std::declval<_Tp>()
将始终作为求值的结果。声明操作数选择是如何工作的?编辑:原读于Nicolai M. Josuttis的《c++标准库:教程和参考,第二版》,第125页。但与我的GCC头文件相比,这里给出的形式略有简化。
在表达式true ? std::declval<_Tp>() : std::declval<_Up>()
中,总是选择第一个可选项,但整个表达式必须是有效的表达式。所以std::declval<_Up>()
必须是有效的,这意味着_Up
必须是一个接受零参数的可调用对象。除此之外,_Tp()
和_Up()
必须返回相同的类型(或者其中一种类型必须隐式转换为另一种类型),否则三元迭代器将无法选择返回值。
这种技术被称为SFINAE(替换失败不是错误)。这个想法是,如果模板实例化失败,那么它不是一个错误,这个模板只是被忽略,编译器搜索另一个模板。
这里的想法是?:
要求第二个和第三个操作数具有相同的类型,或者一种类型可转换为另一种类型。
否则,函数的实例化将失败,并选择其他重载。
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- C++decltype和圆括号-为什么
- 如何将C++中的库和头与MinGW一起使用
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- Confusion: decltype vs std::function
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 将 decltype 和 std::function 与 lambda 一起使用
- 将 decltype 与虚拟成员函数指针一起使用
- 偏移量可以与从decltype获得的结构类型一起使用吗?
- 奇怪的操作符?:与decltype一起使用
- 将decltype与成员函数指针一起使用