c++14相关内容
考虑以下事项: struct A {/* ... */};一个 foo() {自动 p = std::make_pair(A{}, 2);//... 做一点事返回 p.first;}汽车 a = foo(); p.first 会被复制、移动或 RVO 编辑吗? 解决方案 我发现在 Visual Studio 2010 和 gcc-5.1 RVO 中未应用(参见例如 http://col
..
此代码段在 Visual Studio 2013(版本 12.0.31101.00 更新 4)中编译没有错误 A 类{上市:一个(){}A(A &&){}};int main(int, char*){一个;新的 A(a);返回0;} 在 Visual Studio 2015 RC(版本 14.0.22823.1 D14REL)中编译时出现此错误: 1>------ 构建开始:项目:foo,配
..
让我们来处理非常基本的动态分配内存.我们取一个 3 的向量,设置它的元素并返回向量的总和. 在第一个测试用例中,我使用带有 new[]/delete[] 的原始指针.在第二个我使用 std::vector: #include int main(){//int *v = new int[3];//(1)auto v = std::vector(3);//(2)for (int i = 0;
..
以下代码在 clang++ 3.7.0 下编译,但被 g++ 5.3.1 拒绝.两者都有 -std=c++14 选项.哪个编译器是正确的?任何人都知道标准中的哪里谈论这个?谢谢. #include 使用命名空间标准;constexpr int f(int n) {if (n 输出 [隐藏] g++ -std=c++14 c.cppc.cpp:在函数‘constexpr int f(int)
..
标准中是否允许: 结构体A{int a = 3;整数 b = 3;};一个{0,1};//??? 这个类还聚合吗?clang 接受此代码,但 gcc 不接受. 解决方案 在 C++11 中,具有类内成员初始值设定项使结构/类不是聚合 —然而,这在 C++14 中有所改变.当我第一次遇到它时,我发现这是令人惊讶的,这种限制的基本原理是类内初始化器与用户定义的构造器非常相似,但反论点是没有
..
gcc 在没有警告的情况下编译以下代码: #include 结构 foo {静态 constexpr double a = std::cos(3.);static constexpr double c = std::exp(3.);静态 constexpr double d = std::log(3.);静态 constexpr double e1 = std::asin(1.);静态 cons
..
在构建一个基于 lambda 的小型元编程库时,我有必要在 C++14 通用 lambda 中使用递归来实现一个 左折叠. 我自己的解决方案是将 lambda 本身作为其参数之一传递,如下所示: template constexpr auto fold_l_impl(TAcc acc, TF f, Ts ... xs){//折叠步骤.自动步骤([=](自动自我){返回 [=](自动 y_a
..
在回答这个问题时,关于尝试构造一个可变参数转发引用构造函数,只有在没有其他构造函数时才应调用该构造函数有效的.也就是说,如果有: C(const char*, size_t) { }//1模板 C(T&&...) { }//2 我们希望 C c1{"abc", 2}; 调用 (1),尽管需要转换,但是 C c2{1, 2, 3}; 调用 (2),因为 (
..
我想将 std::make_unique 函数声明为我班级的朋友.原因是我想声明我的构造函数 protected 并提供使用 unique_ptr 创建对象的替代方法.这是一个示例代码: #include 模板 A级{上市://不知何故,我想将 make_unique 声明为朋友朋友 std::unique_ptr>std::make_unique();静态 std::unique_ptr创建A
..
我有以下情况可以使用 std::enable_if : template::value>::type* = nullptr>无效 f() { }模板::value>::type* = nullptr>无效 f() { } 现在,我在 cppreference 中看到了新语法,在我看来更清晰:typename = std::enable_if_t::va
..
我很喜欢使用可变参数模板,并开始摆弄这个新功能.我试图了解 std::index_sequence 的实现细节(用于元组实现).我在那里看到了示例代码,但我真的想要一步一步地解释 std::index_sequence 是如何编码的,以及每个阶段有问题的元编程原理.想想真的愚蠢的:) 解决方案 我在那里看到了示例代码,但我真的想要一步一步地解释 index_sequence 是如何编码
..
C++14 将允许创建模板化的变量.通常的例子是一个变量 'pi',它可以被读取以获得各种类型的数学常数 π 的值(int 为 3;float 可能是最接近的值等) 除了我们可以通过将变量包装在模板化结构或类中来拥有此功能之外,这如何与类型转换混合?我看到一些重叠. 除了 pi 示例之外,它如何处理非常量变量?任何使用示例来了解如何充分利用此类功能及其目的是什么? 解决方案
..
template 结构搭便车{static_assert(sizeof(answer) != sizeof(answer), "无效答案");};模板 struct Hitchhiker{}; 在尝试使用 static_assert 禁用通用模板实例化时,我发现 clang 中的上述代码即使没有实例化模板也会生成断言错误,而 gcc 仅在使用 42 以外的参数实例化 Hitchhik
..
(参考 这个问题和答案.) 在C++17标准之前,中包含了下面这句话[basic.compound]/3: 如果类型 T 的对象位于地址 A,则称其值为地址 A 的类型为 cv T* 的指针指向该对象,无论该值是如何获得的. 但从 C++17 开始,这句话已经删除. 例如我相信这句话定义了这个示例代码,并且因为 C++17 这是未定义的行为: alignas(int)
..
我想知道是否有一种简单直接的方法可以在 C++ 中并行计算诸如 for 和基于范围的 for 循环之类的循环.你会如何实施这样的事情?我从 Scala 知道 map、filter 和 foreach 函数,也许也可以并行执行这些函数?有没有一种简单的方法可以在 C++ 中实现这一点? 我的主要平台是 Linux,但如果它可以跨平台工作就好了. 解决方案 借助 C++17 中的并行算法
..
我目前在我的 Qt 应用程序中使用 C++11 功能.但是,我想在我的应用程序中使用一些新的 C++14 特性. 要在Qt应用程序中启用C++11,只需在qmake项目文件中添加一行,即: CONFIG += c++11 或者对于早期版本: QMAKE_CXXFLAGS += -std=c++1y 我已经尝试用 C++14 做同样的事情,但是没有用.我像这样更改了 qmake 项目的
..
我在 Cppcon14 上观看了 Walter Brown 关于现代模板编程的演讲(第一部分,第二部分),在那里他展示了他的 void_t SFINAE 技术. 示例: 给定一个简单的变量模板,如果所有模板参数都格式正确,则计算结果为 void: 模板 以及以下特征,用于检查名为 member 的成员变量是否存在: 模板或丢弃(sfinae)模板结构 has_member>: std
..
我尝试实现 C++14别名模板make_integer_sequence,它简化了类模板integer_sequence. 模板struct integer_sequence{typedef T value_type;static constexpr size_t size() noexcept { return sizeof...(I) ;}};模板;//仅用于说明. 要实现make_int
..
如初始化是否需要左值右值转换?是 int x = x; UB 吗? C++ 标准在 3.3.2 声明点 部分有一个令人惊讶的例子,其中int 用它自己的不确定值初始化: int x = 12;{ int x = x;} 这里第二个 x 用它自己的(不确定的)值初始化.— 结束示例 ] Johannes 对这个问题的回答表明是未定义的行为,因为它需要左值到右值的转换. 在最新的 C+
..
从我的个人经验和咨询诸如 有哪些用途的问题的答案decltype(auto)?我可以找到许多将 decltype(auto) 作为函数返回类型占位符的有价值的用例. 然而,我很难为 decltype(auto) 变量想到任何有效的(即有用的、现实的、有价值的)用例.想到的唯一可能性是存储返回 decltype(auto) 的函数的结果以供以后传播,但 auto&& 也可以在那里使用,并且会更
..