vso*_*tco 7 c++ stl c++11 gcc4.9
请考虑以下代码:
#include <iostream>
#include <vector>
#include <array>
using namespace std;
typedef double (C_array)[10];
int main()
{
std::vector<C_array> arr(10);
// let's initialize it
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
arr[i][j] = -1;
// now make sure we did the right thing
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我刚从@juanchopanza /sf/answers/1757607561/发现这段代码不合法,因为普通的旧式C数组不可分配/可复制/可移动.然而,g++通过代码,即使有-Wall -Wextra -pedantic.clang++不编译它.当然,如果我尝试做类似的事情auto arr1 = arr;,它会失败g++,因为它不知道如何复制arr到arr1.
我用g++4.9从macports下OS X小牛.现场代码:http://goo.gl/97koLa
我的问题是:
g++如此越野车?我不断发现很多简单的例子,其中g++盲目编译非法代码,最后是昨天 用户定义的转换运算符优先级,用g ++编译而不是clang ++,并且没有太多的努力,只是C++为了好玩而尝试.您的代码不是有效的 C++03。首先,头文件<array>不是 C++03 标准库的一部分,但这里也不需要它。二、构造向量对象尝试调用构造函数
explicit vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());\nRun Code Online (Sandbox Code Playgroud)\n\n但是,val 的初始化失败的原因与您无法写入的原因相同
\n\nC_array foo = C_array();\nRun Code Online (Sandbox Code Playgroud)\n\n据我所知,C++03 标准第 5.2.3 节中的第 2 段仅允许对非数组类型使用此表示法:
\n\n\n\n\n表达式 T(),其中 T 是非数组完整对象类型或(可能是 cv 限定的)void 类型的简单类型说明符 (7.1.5.2),创建指定类型的右值,即 value -初始化(8.5;对于 void() 情况不进行初始化)。
\n
此外,g++-4.9.0 也拒绝编译代码,除非在命令行上提供 -std=c++11:
\n\nfoo.cpp: In constructor \xe2\x80\x98std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const value_type&, const allocator_type&) [with _Tp = double [10]; _Alloc = std::allocator<double [10]>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::value_type = double [10]; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<double [10]>]\xe2\x80\x99:\nfoo.cpp:11:32: error: functional cast to array type \xe2\x80\x98std::vector<double [10]>::value_type {aka double [10]}\xe2\x80\x99\n std::vector<C_array> arr(10);\n...\nRun Code Online (Sandbox Code Playgroud)\n\n对于 C++11,向量容器提供了一个额外的填充构造函数:
\n\nexplicit vector (size_type n);\nRun Code Online (Sandbox Code Playgroud)\n\n此构造函数要求模板类型是可默认构造的(请参阅第 23.3.6.2 节)。据我所知,C++11 中也未满足此要求(请参阅第 17.6.3.1 节),因为为了满足要求,表达式 C_array() 必须创建一个临时对象,这在 C+ 中也是无效的+11(再次参见第 5.2.3 节)。我不知道标准是否实际上要求编译器拒绝代码,或者如果不满足其中一项要求,是否允许编译器编译它,但标准库的实现不需要它。也许对C++11了解更多的人可以填补这里的空白。
\n\n除此之外,在我看来,尝试使用数组作为容器元素类型并不是一个好主意,因为不满足其他容器要求。例如,C_array 不可复制插入,因此无法复制向量。
\n\n关于你的第二个问题:请随意浏览 gcc bugzilla 数据库https://gcc.gnu.org/bugzilla/。然而,接受无效代码也可能是有意的,例如为了不破坏遗留代码。
\n| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |