使用C++ 14标准,std::array可以使用单个括号进行初始化(请参阅http://en.cppreference.com/w/cpp/container/array):
然而,这并没有为工作std::array的std::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) 我们x是某种类型的先前已初始化的变量.是以下行:
x = std::move(x)
Run Code Online (Sandbox Code Playgroud)
未定义?这个标准在哪里?它对它有什么看法?
我想了解哪些版本的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 ++功能的站点.
如果我按如下方式初始化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版本中的一个错误,还是故意做的?如果是这样,为什么?
鉴于可用性make_unique和make_shared自动删除unique_ptr以及shared_ptr析构函数,在C++ 14中使用new和使用的情况(除了支持遗留代码之外)是delete什么?
鉴于所有这三个函数,这个调用是不明确的.
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++ 14(又名C++ 1y)标准处于接近最终的状态,程序员必须问自己有关向后兼容性以及与此相关的问题.
这个问题
在该问题的答案中,指出该标准有一个附录,专门用于有关修订之间变化的信息.
如果可以解释前面提到的附录中的这些潜在问题,或许在任何与那里提到的相关的正式文件的帮助下,将会有所帮助.
这是这个问题的后续问题:声明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,那么有什么意义呢?这是标准中的疏忽,将来会得到修复吗?
在一个采用相同类型的多个参数的函数中,我们如何保证调用者不会搞乱排序?
例如
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++ 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++14 ×10
c++ ×9
c++11 ×7
arrays ×1
c++17 ×1
clang ×1
constexpr ×1
decltype ×1
llvm-clang ×1
new-operator ×1
overloading ×1