c++ - 何时使用表达式的类型(不是类别)?
问题描述
我知道c ++中的每个表达式都有一个类别(prvalue,xvalue,lvalue..)和一个根据标准草案永远不是引用类型的类型(如果不是prvalue,可能是cv限定的)
5 如果表达式最初具有类型“对 T 的引用”(8.3.2、8.5.3),则在进一步分析之前将类型调整为 T。表达式指定引用表示的对象或函数,表达式是左值或 x 值,具体取决于表达式。
6 如果纯右值最初具有类型“cv T”,其中 T 是无 cv 限定的非类、非数组类型,则表达式的类型在任何进一步分析之前调整为 T。
鉴于 decltype 有自己的一套规则,而自动推导也有不同的规则,那么这种“非引用表达式类型”何时重要?
解决方案
它在未评估的表达式中很重要:
typeid
:
typeid(std::cout << 0) == typeid(std::ostream);
// true
noexcept
:
template<class T> void f() noexcept(noexcept(T{}+T{}))
sizeof
(即使sizeof
有一个特定的规则,与完整表达式类型的规则不矛盾):
sizeof(std::cout << 0);
// the expression returns an std::ostream&, but its type is std::ostream
等等
推荐阅读
- scala - Scala / sbt java.lang.ClassNotFoundException: com.ullink.slack.simpleslackapi.listeners.SlackMessagePostedListener
- r - 为什么 r 不像 spss 那样在 0 和 1 中编码因子来计算 $r$ 系数?
- python-3.x - 将整数分配给数据框字段`OverflowError: Python int too large to convert to C unsigned long`
- git - 当我从 dockerfile 执行 git clone 时,我怎么知道我在哪个 git 分支上
- c# - 设置父按钮禁用?
- http - Flutter http.post 从不返回响应
- android - AndroidX数据绑定生成错误
- .net-core - 在 dotnet core 2.1 中编译后的 appsettings 在哪里
- c# - 运算符“||” 不能应用于“object”和“bool”类型的操作数
- regex - 如何将 grep 与文件中的正则表达式和模式一起使用?