Questions tagged «c++14»

C ++ 14是2014年批准的C ++标准的名称。它以以前的C ++ 11标准为基础,改进了核心语言和标准库并添加了一些功能。

3
链接C ++ 17,C ++ 14和C ++ 11对象是否安全
假设我有三个编译对象,它们都是由同一编译器/版本生成的: A是使用C ++ 11标准编译的 B用C ++ 14标准编译 C用C ++ 17标准编译 为简单起见,我们假设所有标头均使用 C ++ 11编写,仅使用其语义在所有三个标准版本之间均未改变的构造,因此任何相互依赖关系都可以通过标头包含正确表达,并且编译器不反对。 这些对象是哪种组合,链接到单个二进制文件不安全吗?为什么? 编辑:涵盖主要编译器(例如gcc,clang,vs ++)的答案是受欢迎的
97 c++  c++11  linker  c++14  abi 

6
错误:: make_unique不是'std'的成员
我正在尝试编译代码审查中发布的以下线程池程序以对其进行测试。 /codereview/55100/platform-independant-thread-pool-v4 但是我得到了错误 threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’: threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function ‘int main()’: main.cpp:9:17: error: …

2
只与一个成员一起使用联合的目的是什么?
当我阅读seastar源代码时,我注意到有一个称为tx_side只有一个成员的联合结构。这是解决某些问题的技巧吗? 仅供参考,我将tx_side以下结构粘贴: union tx_side { tx_side() {} ~tx_side() {} void init() { new (&a) aa; } struct aa { std::deque<work_item*> pending_fifo; } a; } _tx;
89 c++  c++14  unions 

5
为什么lambda的大小为1个字节?
我正在使用C ++中的一些lambda进行内存存储,但是我对它们的大小有些不解。 这是我的测试代码: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } 您可以在此处运行它:http : //fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 输出是: 17 0x7d90ba8f626f 1 这表明我的λ大小为1。 这怎么可能? lambda至少不应该是其实现的指针吗?
89 c++  c++11  lambda  c++14  sizeof 

3
什么是const void?
std::is_void状态描述为: 如果T是类型void,const void,volatile void或const volatile void ,则提供等于true的成员常数值。 那么这可能是const void,或volatile void? 此答案指出const void返回类型将无效(但是在VC ++ 2015上编译) const void foo() { } 如果按照标准,const void是无效的(VC错误),那么什么是const void?
89 c++  c++11  c++14 

3
默认值和零初始化混乱
我对value-&default-&zero-initialization感到非常困惑。特别是当他们采用不同的标准C ++ 03和C ++ 11(和C ++ 14)时。 我在这里引用并尝试扩展一个很好的答案Value- / Default- / Zero-Init C ++ 98和C ++ 03,使其更通用,因为如果有人可以帮助填写,它将对很多用户有所帮助需要差距才能很好地了解何时会发生什么? 简而言之,通过示例全面了解: 有时由new运算符返回的内存将被初始化,有时并不取决于您要更新的类型是POD(普通旧数据),还是它是包含POD成员并且正在使用a的类。编译器生成的默认构造函数。 在C ++ 1998中,有两种初始化类型:零初始化和默认初始化 在C ++ 2003中,第三种初始化类型是值初始化。 在C ++ 2011 / C ++ 2014中,仅添加了列表初始化,并且value- / default- / zero-initialization的规则有所更改。 承担: struct A { int m; }; struct B { ~B(); int m; }; …
88 c++  c++11  c++14  c++03  c++98 

3
自C ++ 17起,具有正确地址和类型的指针仍然始终是有效的指针吗?
(参考此问答)。 在C ++ 17标准之前,[basic.compound] / 3中包含以下句子: 如果类型T的对象位于地址A,则将其值为地址A的cv T *类型的指针指向该对象,而不管如何获取该值。 但是从C ++ 17开始,此句子已删除。 例如,我相信这句话使此示例代码已定义,并且由于C ++ 17,这是未定义的行为: alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1+1) int{}; *(p1+1)=10; 在C ++ 17之前,p1+1持有的地址*p2并具有正确的类型,因此*(p1+1)是的指针*p2。在C ++ 17p1+1中,指针是一个end-the-end,因此它不是指向对象的指针,并且我相信它是不可引用的。 是对标准权利的这种修改的解释,还是有其他规则可以补偿所引用句子的删除?

1
使用原始存储时如何模​​拟EBO?
我有一个实现低级泛型类型时使用的组件,该泛型类型存储任意类型的对象(可能是也可能不是类类型),该对象可能为空以利用空基础优化: template <typename T, unsigned Tag = 0, typename = void> class ebo_storage { T item; public: constexpr ebo_storage() = default; template < typename U, typename = std::enable_if_t< !std::is_same<ebo_storage, std::decay_t<U>>::value > > constexpr ebo_storage(U&& u) noexcept(std::is_nothrow_constructible<T,U>::value) : item(std::forward<U>(u)) {} T& get() & noexcept { return item; } constexpr const T& …
79 c++  c++14 

3
尽管右侧有异常,但仍发生C ++中的赋值
我有一些(C ++ 14)代码看起来像这样: map<int, set<string>> junk; for (int id : GenerateIds()) { try { set<string> stuff = GetStuff(); junk[id] = stuff; } catch (const StuffException& e) { ... } } 这有效。有时会GetStuff()抛出一个异常,这很好用,因为如果可以,那么我就不需要垃圾地图中的值。 但是起初我是在循环中编写此代码的,这是行不通的: junk[id] = GetStuff(); 更准确地说,即使GetStuff()抛出异常,junk[id]也会被创建(并分配一个空集)。 这不是我期望的:我希望它们以相同的方式起作用。 这里有我误解的C ++原理吗?
73 c++  c++14 

7
按值传递vs按右值引用传递
我何时应该将函数声明为: void foo(Widget w); 相对于 void foo(Widget&& w);? 假设这是唯一的重载(例如,我选择一个或另一个,而不是两个,也没有其他重载)。不涉及模板。假设该功能foo需要拥有Widget(例如const Widget&,这不是本讨论的一部分)。在这些情况范围之外,我对任何答案都不感兴趣。有关为什么这些约束是问题的一部分,请参见文章末尾的附录。 我和我的同事可以想到的主要区别是,右值引用参数迫使您对副本明确。调用方负责制作显式副本,然后在std::move需要复制时将其传递给它。在按值传递的情况下,副本的成本被隐藏: //If foo is a pass by value function, calling + making a copy: Widget x{}; foo(x); //Implicit copy //Not shown: continues to use x locally //If foo is a pass by rvalue reference function, calling + making a copy: …
72 c++  c++11  c++14 

6
C ++ 14中的Lambda-Over-Lambda
接下来的递归lambda调用如何结束/终止? #include <cstdio> auto terminal = [](auto term) // <---------+ { // | return [=] (auto func) // | ??? { // | return terminal(func(term)); // >---------+ }; }; auto main() -> int { auto hello =[](auto s){ fprintf(s,"Hello\n"); return s; }; auto world =[](auto s){ fprintf(s,"World\n"); return s; }; …
69 c++  lambda  c++14 

4
C ++ 11:正确的std :: array初始化吗?
如果我按以下方式初始化std :: array,则编译器会向我发出有关括号丢失的警告 std::array<int, 4> a = {1, 2, 3, 4}; 这样可以解决问题: std::array<int, 4> a = {{1, 2, 3, 4}}; 这是警告消息: missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces] 这只是我的gcc版本中的错误,还是故意做的?如果是这样,为什么?

7
为什么未为C ++ 14数字分隔符选择空格字符?
从C ++ 14开始,由于n3781(它本身不能回答这个问题),我们可以编写如下代码: const int x = 1'234; // one thousand two hundred and thirty four 目的是改进这样的代码: const int y = 100000000; 并使其更具可读性。 下划线(_)字符已经由用户定义的文本采取了C ++ 11,和逗号(,)的本地化问题-许多欧洲国家令人困惑†以此作为小数点分隔符-和冲突与逗号操作,虽然我做的想知道允许使用可能破坏了哪些实际代码1,234,567。 无论如何,更好的解决方案似乎是空格字符: const int z = 1 000 000; 这些相邻的数字文字标记可以和字符串文字一样由预处理器连接: const char x[5] = "a" "bc" "d"; 相反,我们得到撇号('),我所知道的任何书写系统都没有使用它作为数字分隔符。 是否存在选择撇号而不是简单空格的原因? †之所以感到莫名其妙,是因为所有这些语言在文本内都保持着逗号的概念,即“分开”原本原子的句子,并用句号“终结”该句子-至少对我而言,这与逗号“分解”数字的整数部分,并用句号“终止”数字以准备小数输入。

5
如何在Lambda本身中获取C ++ Lambda函数的地址?
我试图弄清楚如何获取自身内部的lambda函数的地址。这是一个示例代码: []() { std::cout << "Address of this lambda function is => " << ???? }(); 我知道我可以在变量中捕获lambda并打印地址,但是我想在执行此匿名函数时就地执行该操作。 有没有更简单的方法?
53 c++  c++11  lambda  c++14  c++17 

1
为什么std :: atomic构造函数在C ++ 14和C ++ 17中表现不同
我在使用C ++ 11的项目中工作,并且尝试了以下代码 #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } 我收到编译器错误 error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ 对于C ++ 14,结果相同。当我切换到C ++ 17时,它可以工作:wandbox 我检查了cppreference的区别: std::atomic std::atomic<T>::operator= std::atomic<T>::atomic 但是C ++ 14和C ++ 17之间没有任何区别。为什么它与C …
19 c++  c++14  c++17  stdatomic 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.