c++17相关内容
C++模板-完整指南第2版第436页有以下脚注(我的粗体): 不同的是,与其他上下文中的调用表达式不同,decltype(call-expression)不要求非引用、非void返回类型是完整的。而使用decltype(std::declval().begin(), 0)确实增加了调用的返回类型必须完整的要求,因为返回值不再是decltype操作数的结果。 脚注是指使用declt
..
struct B { B(int) {} B(B const&) {} }; struct D: B { using B::B; }; int main(void) { B b(5); D d(b); // error return 0; } c++14在12.9[class.inhctor]/p3中明确从继承的构造函数中排除复制/移动构造函数。 对于继承的候
..
为什么std::size()在通过值传递的静态分配数组上不起作用? void print_elemTab(int tab[]) { // ... int size = std::size(tab); //error // ... } void test_tab() { const int TAB_SIZE = 5; int tab[T
..
删除了包含POD和默认构造函数的结构。使用-std=c++2a编译时,尝试聚合初始化结构的实例会导致g++9.1中的编译错误。使用-std=c++17可以很好地编译相同的代码。 https://godbolt.org/z/xlRHLL struct S { int a; S() = delete; }; int main() { S s {.a = 0}; }
..
C++17 filesystem基于bost.filessystems。 我现在正在Windows和VS2017上使用它。 #include namespace fs = std::experimental::filesystem; 我遍历目录 for (auto& p: fs::directory_iterator("media")) 我要将路
..
我在使用STL标头中的std::reduce()函数时找不到问题。 由于我找到了解决方法,我将显示第一个预期行为: uint64_t f(uint64_t n) { return 1ull; } uint64_t solution(uint64_t N) // here N == 10000000 { uint64_t r(0); // p
..
我有一个模板类,我想向模板的特定专门化添加一个特殊函数。此函数仅对std::String模板有意义。 我展示了我目前是如何处理这个问题的…问题是删除的函数仍然对所有模板类型可见,而不仅仅是我想要使用它的匹配模板。 有没有更优雅的方式来处理这种困境? template class Match { /* *Class Definition
..
以下代码给我带来了一些问题,尝试构建并得到错误: “unary_function基类未定义”并且“unary_function”不是std的成员“ std::unary_function已在C++17中删除,那么等效版本是什么? #include struct path_sep_comp: public std::unary_function
..
强制复制省略是否适用于通过结构化绑定的分解?这适用于以下哪些情况? // one auto [one, two] = std::array{SomeClass{1}, SomeClass{2}}; // two auto [one, two] = std::make_tuple(SomeClass{1}, SomeClass{2}); // three struct
..
我希望有一个类型特征flatten_tuple_t,它可以从任意嵌套类型创建平面化元组类型。以下代码片段说明了flatten_tuple_t的预期内容。 template struct flatten_tuple { using type = T; }; // The real implementation goes here // ... // ... tem
..
C++模板-完整指南第2版在第435页提供了以下代码 #include #include template struct HasBeginT : std::false_type {}; template struct HasBeginT
..
我知道我可以做到 auto&& bla = something(); 根据something返回值的const程度,我会为bla获取不同的类型。 这是否也适用于结构化绑定的情况,例如 auto&& [bla, blabla] = something(); 我想是的(结构化绑定搭载在auto初始值设定项上,其行为如下),但我找不到明确的“是”。 更新:初步测试似乎达到
..
我经常使用boost::variant,非常熟悉。boost::variant对绑定的类型没有任何限制,特别是可以是引用: #include #include int main() { int x = 3; boost::variant v(x); // v can hold references
..
C++17删除了三联图。IBM强烈反对这一点(here和here),因此似乎存在删除/不删除两边的争论。 但是既然已经决定删除三联码,为什么还要留下有向图呢?除了保留三重图(显然重量不足以保存它们)之外,我看不到任何保留有向图的理由。 推荐答案 对于不知情的用户来说,三元图比有向图更有问题。这是因为它们被替换在字符串文字和注释中。以下是一些…示例 示例A: std::st
..
[dcl.init]/17.6中明确写到,初始化圆括号时,会发生副本省略: 如果初始化器表达式是prvalue,并且源类型的cv非限定版本与目标的类相同,则初始化器表达式用于初始化目标对象。[ 示例:T x=T());调用T默认构造函数初始化x。 - 结束示例 ] 但是在列表初始化的情况下(上面的段落不适用),我没有发现任何类似的东西。请参见[dcl.init.list]。 那么
..
我读到在C++17中,我们可以在if语句中初始化变量,如下所示 if (int length = 2; length == 2) //execute something 而不是 int length = 2; if (length == 2) //do something 尽管它较短,但会影响代码的可读性(特别是对于不了解此新功能的人),我认为这对于大型软件开发
..
C++17引入了属性[[maybe_unused]]。 我假设这是GCC和朗的标准化版本:__attribute__((unused))。 对于我不希望看到警告的未使用函数, 我是否应该在 上指定属性 函数声明? void maybe_used_function() [[maybe_unused]]; 或函数定义? void maybe_used_function()
..
C++17 评估顺序保证 (P0145) 中的投票对典型 C++ 代码有何影响? 它对以下内容有何改变? i = 1;f(i++, i) 和 std::cout
..
此常见问题解答是关于聚合和POD的,涵盖以下材料: 什么是聚合? 什么是POD(普通旧数据)? 它们有什么关系? 它们有什么特别之处,为什么特别? C++11 有哪些变化? 解决方案 如何阅读: 这篇文章比较长.如果您想了解聚合和 POD(普通旧数据),请花时间阅读.如果您只对聚合感兴趣,请阅读第一部分.如果您只对 POD 感兴趣,那么您必须首先阅读聚合的定义、含义和示
..
C++ 委员会中有一个范围研究小组: 但我没有关注这个研究组的历史,我不确定 C++1z 的预期交付类型(此外我不使用 boost.range,因此我对现有的实践).我们会有: 将范围作为一对第一个/最后一个迭代器? 范围上的联合和其他集合操作(例如 [v.begin()+5, v.begin()+7[ U [v.begin()+10, v.begin()+15[ U[v.b
..