好的,这就是 n3337.pdf 中的 [expr.prim.lambda]p16 中的一招。下面以代码为例:
int a = 1, b = 1, c = 1;
auto m1 = [a, &b, &c]() mutable
{
auto m2 = [a, b, &c]() mutable
{
std::cout << a << b << c; // Shouldn't this print 113 or 133?
a = 4; b = 4; c = 4;
};
a = 3; b = 3; c = 3;
m2();
};
a = 2; b = 2; c = 2;
m1();
std::cout << a << …Run Code Online (Sandbox Code Playgroud) 我正在浏览 C++ 标准 n4713.pdf。考虑下面的代码:
#include <iostream>
#include <type_traits>
enum UEn
{
EN_0,
EN_1,
EN_L = 0x7FFFFFFFFFFFFFFF // EN_L has type "long int"
}; // UEn has underlying type "unsigned long int"
int main()
{
long lng = 0x7FFFFFFFFFFFFFFF;
std::cout << std::boolalpha;
std::cout << "typeof(unsigned long == UEn):" << std::is_same<unsigned long, std::underlying_type<UEn>::type>::value << std::endl; // Outputs "true"
std::cout << "sizeof(EN_L):" << sizeof(EN_L) << std::endl;
std::cout << "sizeof(unsigned):" << sizeof(unsigned) << std::endl;
std::cout << "sizeof(unsigned long):" << sizeof(unsigned long) << std::endl;
std::cout …Run Code Online (Sandbox Code Playgroud) 我正在阅读 C++11 标准草案,关于 [expr.typeid] 的部分提到了以下内容(重点是我的):
[...]
当 typeid 应用于多态类类型的泛左值以外的表达式时,结果引用表示表达式静态类型的 std::type_info 对象。左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 的转换不适用于表达式。如果表达式的类型是类类型,则该类应该是完全定义的。该表达式是一个未计算的操作数(第 5 条)。
当 typeid 应用于type-id 时,结果引用表示 type-id 类型的 std::type_info 对象。如果 type-id 的类型是对可能有 cv 限定类型的引用,则 typeid 表达式的结果引用表示 cv 未限定引用类型的 std::type_info 对象。如果 type-id 的类型是类类型或类类型的引用,则该类应该是完全定义的。
进一步在同一部分的 p5 中,它继续给出以下示例:
class D { /* ... */ };
D d1;
const D d2;
typeid(d1) == typeid(d2); // yields true
typeid(D) == typeid(const D); // yields true
typeid(D) == typeid(d2); // yields true
typeid(D) == typeid(const D&); …Run Code Online (Sandbox Code Playgroud)