C++ 虐我千百遍
109 subscribers
31 photos
7 links
Download Telegram
string a="foo";
string b="bar";
pair<string,string> c=make_pair<string,string>(a,b);
以上C++98编译通过,C++11会CE(
#include <iostream> 以后不能直接使用 std::istreamstd::ostream ,应当 #include <istream>#include <ostream> (C++11 之前
转自院士
parameter pack 不能直接作为类型存下来,只能用 tuple 之类的东西包着存,这太蛋疼了
今日疑似发现 GCC 10 的几个 bug
1. if constexpr (requires { xxx; }) 如果 xxx 里面有局部作用域的 ...(parameter pack 展开),特定情况下编译器只会检查语法而不会检查语义,导致不该被编译的代码实际上被编译了
2. 特定情况下,无参数的 lambda 表达式在用<>显式指定模板参数的同时省略了参数列表(),会导致编译器认为语法错误,形如 []<int x>{return x;}
如果明明是新加了功能,编译器用的时间和空间却明显变小了,可能就要想一想是不是写出了大概率 UB 的代码。。。
static void func(){} 写成 void static func(){} 也是可以的(
如果要开一个变量,其类型是模板参数,那么
* 要么,正确处理模板参数带 const 或带引用的情况(尤其是参数带着 && 的时候,一不小心就 const 或者 & 或者 && 了)
* 要么,先 decay 再存,也就是从存 T 变成存 decay_t<T>(看具体功能)
* 实在不行,static_assert 掉不愿意处理的情况(
要是忘了处理引用的情况,当场可能没锅,后续维护忘了这事,CE 事小, 涉及到生命周期的 UB 事大啊(
转图
Forwarded from Miao Wu
我才发现可以这么写:i ? : -1
C++ 虐我千百遍
我才发现可以这么写:i ? : -1
(注意,这不是标准 C++,应该是方言
Forwarded from Chenyao Lou
写了一个 optional<reference_wrapper<T>> ,然后感觉哪里不太对,然后改成了 T*
考虑这个场景:
{
T t;
do_something(t);
}

能否在 do_something(T&&) 是 well-formed 的情况下自动优化成 do_something(move(t)); ??
[](...){[](){[](){}();}();}([]{[]{}();},[](){});
在构造函数里面构造成员的时候如果用到了 lambda,除了 [&] 以外一定要注意有没有需要 = 的!!!for 循环里面有 lambda,要检查循环变量要不要 = capture!!!
有没有啥能够 format 长函数名的工具?一个函数名好几屏的已经不想活了(