C++ 虐我千百遍
109 subscribers
31 photos
7 links
Download Telegram
Channel created
为啥 initializer_list 不把 size 放到模板参数里面呢,明明是编译期能确定的呀
放到模板参数没法表达 {{1}, {1,2}} 这样的
Channel photo updated
招管理员
投稿请在讨论群 #投稿
从 C++17 起,如何从地址获得一个指定类型的对象?用 std::launder
alignas(T) char c[sizeof T];
T* p = new(&c) T { /*args*/ };
p->do_something(); // certainly ok
reinterpret_cast<T*>(&c)->do_something(); // ub 因为 cast 结果没有指向一个 T 类型的对象
std::launder(reinterpret_cast<T*>(&c))->do_something(); // ok
已知 `struct Test { };` 没有其他相关定义,那么 `std::is_default_constructible_v<std::hash<Test>>` 的值是?
Anonymous Quiz
46%
true
23%
false
23%
<ill-formed>
8%
<undefined behavior>
0%
<implementation defined>
无副作用的死循环是 UB。
不过。即使 while(1); 已经 UB 了,正常的编译器也会把它编译成死循环,而不是把它编译成格盘代码……
为啥 initializer_list 没有 operator[] 呢
std::filesystem::is_empty 和 std::is_empty 的起名是不是有点失败(
Forwarded from Miao Wu
投稿:2147483647==(int)(float)2147483647
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(){} 也是可以的(