标签: c++14

为什么在C++ 14中对数组的初始化仍然需要双括号?

使用C++ 14标准,std::array可以使用单个括号进行初始化(请参阅http://en.cppreference.com/w/cpp/container/array):

然而,这并没有为工作std::arraystd::pair.

为什么这些工作:

std::pair<int, int> p { 1, 2 };
std::array<int, 3> a {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但是这工作:

std::array<std::pair<int, int>, 3> b {{1, 11}, {2, 22}, {3, 33}};
Run Code Online (Sandbox Code Playgroud)

虽然这确实有效吗?

std::array<std::pair<int, int>, 3> b {{{1, 11}, {2, 22}, {3, 33}}};
Run Code Online (Sandbox Code Playgroud)

此外,为了完成,一个好的旧数组的初始化确实适用于单个大括号

std::pair<int, int> c[3] {{1, 11}, {2, 22}, {3, 33}};
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list c++14

62
推荐指数
3
解决办法
3929
查看次数

是x = std :: move(x)未定义?

我们x是某种类型的先前已初始化的变量.是以下行:

x = std::move(x)
Run Code Online (Sandbox Code Playgroud)

未定义?这个标准在哪里?它对它有什么看法?

c++ language-lawyer c++11 c++14

61
推荐指数
3
解决办法
2892
查看次数

获取Apple clang版本和相应的上游LLVM版本

我想了解哪些版本的clang Apple安装在我的macbook中,可以看到c ++ 11和/或c ++ 14的功能.我输入了这个命令:

clang --version

//----response
Apple LLVM version 7.0.0 (clang-700.1.76)     
Target: x86_64-apple-darwin15.0.0    
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

但我无法理解什么(clang-700.1.76)意思.如何将此代码转换为clang版本?

这是您可以检查clang版本http://clang.llvm.org/cxx_status.html中提供的c ++功能的站点.

clang llvm-clang c++11 c++14 c++17

61
推荐指数
6
解决办法
4万
查看次数

C++ 11:正确的std :: array初始化?

如果我按如下方式初始化std :: array,编译器会给出一个关于缺少大括号的警告

std::array<int, 4> a = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题:

std::array<int, 4> a = {{1, 2, 3, 4}};
Run Code Online (Sandbox Code Playgroud)

这是警告信息:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]
Run Code Online (Sandbox Code Playgroud)

这只是我的gcc版本中的一个错误,还是故意做的?如果是这样,为什么?

c++ arrays initialization c++11 c++14

60
推荐指数
4
解决办法
6万
查看次数

新的和删除在C++ 14中仍然有用吗?

鉴于可用性make_uniquemake_shared自动删除unique_ptr以及shared_ptr析构函数,在C++ 14中使用new和使用的情况(除了支持遗留代码之外)是delete什么?

c++ new-operator dynamic-memory-allocation c++11 c++14

59
推荐指数
2
解决办法
3809
查看次数

对象,右值引用,const引用之间的重载分辨率

鉴于所有这三个函数,这个调用是不明确的.

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );
Run Code Online (Sandbox Code Playgroud)

删除f( int )导致Clang和GCC更喜欢左值引用而不是左值引用.但是,删除任一引用过载都会导致模糊不清f( int ).

过载分辨率通常是根据严格的部分排序来完成的,但int似乎相当于两个彼此不相等的东西.这里的规则是什么?我似乎记得有关此问题的缺陷报告.

在未来的标准中是否有int &&可能优先考虑int?引用必须绑定到初始化程序,而对象类型不受约束.因此,在我之间超载T并且T &&可以有效地表示"如果我已获得所有权,则使用现有对象,否则复制".(这类似于纯通的价值,但移动节省的开销).由于这些编译器目前的工作,这必须通过重载来完成T const &T &&,并明确复制.但我甚至不确定这是严格的标准.

c++ overloading rvalue-reference c++11 c++14

58
推荐指数
1
解决办法
3648
查看次数

C++ 14中引入的哪些更改可能会破坏用C++ 11编写的程序?

介绍

随着C++ 14(又名C++ 1y)标准处于接近最终的状态,程序员必须问自己有关向后兼容性以及与此相关的问题.


这个问题

该问题的答案中,指出该标准有一个附录,专门用于有关修订之间变化的信息.

如果可以解释前面提到的附录中的这些潜在问题,或许在任何与那里提到的相关的正式文件的帮助下,将会有所帮助.

  • 根据标准:C++ 14中引入的哪些更改可能会破坏用C++ 11编写的程序?

c++ language-lawyer c++11 c++14

58
推荐指数
1
解决办法
5万
查看次数

为什么不将`std :: initializer_list`定义为文字类型?

这是这个问题的后续问题:声明constexpr initializer_list对象是否合法?.

从C++ 14开始,std::initializer_list该类的所有方法都标有constexpr.能够通过执行来初始化实例似乎很自然, constexpr std::initializer_list<int> list = {1, 2, 3}; 但是Clang 3.5抱怨list没有被常量表达式初始化. 正如dyp在评论中指出的那样,任何std::initializer_list文字类型的要求似乎都从规范中消失了.

如果我们甚至不能将类完全定义为constexpr,那么有什么意义呢?这是标准中的疏忽,将来会得到修复吗?

c++ initializer-list language-lawyer constexpr c++14

58
推荐指数
1
解决办法
2635
查看次数

C++函数参数安全性

在一个采用相同类型的多个参数的函数中,我们如何保证调用者不会搞乱排序?

例如

void allocate_things(int num_buffers, int pages_per_buffer, int default_value ...
Run Code Online (Sandbox Code Playgroud)

然后

// uhmm.. lets see which was which uhh..
allocate_things(40,22,80,...
Run Code Online (Sandbox Code Playgroud)

c++ c++14

58
推荐指数
7
解决办法
3692
查看次数

decltype行为背后的理由是什么?

正如我在C++ 11 decltype(expression)中所理解的,用于推断给定表达式的完全相同类型.但是当表达式放入括号本身时,则推导类型是对表达式类型的左值引用.例如:

int x;
decltype(x) y = x;
Run Code Online (Sandbox Code Playgroud)

相当于int y = x;但是,

int x;
decltype((x)) y = x;
Run Code Online (Sandbox Code Playgroud)

相当于int& y = x;.

分别

 decltype(auto) f1()
 {
   int x = 0;
   return x; // decltype(x) is int, so f1 returns int
 }
Run Code Online (Sandbox Code Playgroud)

 decltype(auto) f2()
 {
   int x = 0;
   return (x); // decltype((x)) is int&, so f2 returns int&
 }
Run Code Online (Sandbox Code Playgroud)

标准委员会选择这种行为的理由是什么?

后记:

现在我观察到,至少在GCC 6.2实现的情况下,当括号中的表达式更复杂时,例如decltype((x + x))推导的类型是T,但不是 …

c++ decltype c++11 type-deduction c++14

57
推荐指数
3
解决办法
2010
查看次数