c++17相关内容
在C和C ++中,数字pi存在一个相当愚蠢的问题.据我了解,math.h中定义的M_PI并不是任何标准所要求的. 新的C ++标准在标准库中引入了许多复杂的数学运算-双曲函数,std::hermite和std::cyl_bessel_i,不同的随机数生成器等等. 任何“新"标准是否都为pi带来了常数?如果没有-为什么?没有它,所有这些复杂的数学如何工作? 我知道在C ++中有关p
..
c ++ 17规范弃用了std::allocator对象的construct和destroy成员.工作组在此处,在“弃用std :: allocator的冗余成员"标题下. 但是,他们没有具体提及为什么不赞成使用这两个成员,或者关于替换该功能的建议是什么.我假设其含义是使用std::allocator_traits::construct代替. 由于 由于此函数提供了自动回退到新放置的
..
今天,我正在阅读clang的C ++ 17支持页面.我注意到有些奇怪.功能将模板模板参数匹配到兼容参数( P0522R0 )被标记为部分,因为必须通过开关将其激活.他们的笔记说: 尽管是缺陷报告的解决方案,但是此功能在所有语言版本中均默认禁用,并且可以在Clang 4中通过标志-frelaxed-template-template-args明确启用.模板部分排序的相应更改,导致合理且先前有效
..
在一个答案中, https://stackoverflow.com/a/704568/8157187 ,引用了Stroustrup: C ++明确允许删除的实现将零 左值操作数,我曾希望实现能够做到这一点, 但是这个想法似乎并没有在实施者中流行. 但是,我未能在标准中找到此明确声明.当前标准草案(N4659)的一部分可以用这种方式解释: 6.7: 到达存储区域的持续时间结束
..
请考虑以下标头,并假定它已在多个TU中使用: static int x = 0; struct A { A() { ++x; printf("%d\n", x); } }; 正如此问题所解释的,这是ODR违规行为,因此也涉及到UB. 现在,如果不违反ODR, inline函数是指非volatile const对象,并且我们不能在该函
..
是否允许编译器对此进行优化(根据C ++ 17标准): int fn() { volatile int x = 0; return x; } 对此吗? int fn() { return 0; } 如果是,为什么?如果没有,为什么不呢? 这是关于此主题的一些思考:当前的编译器将fn()编译为放置在堆栈中的局部变量,然后将其返回.例如,在x86-64
..
参考此问题.用于初始化constexpr变量y的核心常量表达式格式错误.给定了这么多. 但是,如果我尝试将if转换为if constexpr: template void foo() { constexpr int x = -1; if constexpr (x >= 0){ constexpr int y = 1
..
可以通过两种方式访问静态类成员函数或变量:通过对象(obj.member_fun()或obj.member_var)或通过类(Class::member_fun()或Class::member_var).但是,在constexpr函数中,Clang给出了对象访问错误,并需要使用类访问权限: struct S { constexpr static auto s_v = 42;
..
我知道这就像打开Pandora盒子一样,但是它并没有停止打扰我.考虑一个简单的例子: #include template struct Foo: std::false_type { }; template struct Foo:std::true_type { }; int main() {
..
标准N4659的工作草案说: [基本化合物] 如果两个对象是指针可互换的,则它们具有相同的地址 然后注意 即使数组对象和其第一个元素具有相同的地址,它们也不能指针可相互转换 使数组对象及其第一个元素不可指针可互转换的原理是什么?更一般地,将指针可互换性的概念与具有相同地址的概念区分开的原理是什么?那里不存在矛盾吗? 在给定这种陈述顺序的情况下,看来 int a
..
当前的标准草案(大概是C ++ 17)在 .compound/4] : [注意:数组对象及其第一个元素即使指针具有相同的地址,也不能指针可相互转换. —尾注] 因此不能reinterpret_cast指向对象的指针来获取其封闭的数组指针. 现在,有std::launder, [ptr.launder/1] : template [[nodiscard]]
..
Gcc和clang在此代码是否应该编译方面似乎有分歧: #include template struct MyDelegate { }; template struct signature_traits; template cl
..
昨天我见过 #include #include int main() { auto tup = std::make_tuple(1, 2); auto & [ a, b ] = tup; // the following line won't compile for a isn't a reference // sta
..
前奏: std::tuple f(); std::tuple g(); C ++ 1z将为结构化绑定引入语法,这将使编写而不是编写成为可能 int a, b, c; std::tie(a, b, c) = f(); 类似 auto [a, b, c] = f(); 但是,std::tie还允许指
..
在开始大叫未定义的行为之前,明确地列出了 N4659(C ++ 17) i = i++ + 1; // the value of i is incremented N3337(C ++ 11) i = i++ + 1; // the behavior is undefined 发生了什么变化? 据我所知,来自 [N4659 basic.
..
(参考在C ++ 17标准之前, [basic.compound]/3 : 如果类型T的对象位于地址A,则无论其值如何获得,都将以其值为地址A的cv T *类型的指针指向该对象. 但是从C ++ 17开始,此句子已已删除. 例如,我相信这句话使示例代码定义完整,并且自C ++ 17起,这是未定义的行为: alignas(int) unsigned char buffer[
..
constexpr counter ,又称为有状态的元编程.正如文章中提到的,在C ++ 14下似乎是合法的,我想知道C ++ 17有什么变化吗? 以下是基于帖子的实现 template struct flag { friend constexpr int adl_flag(flag); constexpr operator int() { ret
..
cppreference † 指出: 可以通过在任何适当对齐的存储上使用reinterpret_cast创建具有普通默认构造函数的 对象.在分配有std::malloc的内存上. 这意味着以下是定义良好的代码: struct X { int x; }; alignas(X) char buffer[sizeof(X)]; // (A) reinterpret_cast
..
回答我如何写一个看起来像方法的lambda表达式?,我试图利用以下事实将无捕获的lambda转换为成员函数指针:自C ++ 17起,无捕获的lambda具有 constexpr 将转换运算符转换为其函数指针类型. 所以我想到一个问题,直到: template struct A{}; int main() { A(
..
使用以下代码,我得到一个编译错误C2065 'a': undeclared identifier(使用Visual Studio 2017): [] { auto [a, b] = [] {return std::make_tuple(1, 2); }(); auto r = [&] {return a; }(); //error C2065 }(); 但是,以下代码会编
..