- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
考虑以下代码:
#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;
}
}
我刚从@juanchopanza https://stackoverflow.com/a/25108679/3093378 那里得知这段代码不应该是合法的,因为一个普通的旧 C
风格的数组是不可分配/不可复制/可移动的。然而,即使使用 -Wall -Wextra -pedantic
,g++
也会飞过代码。 clang++
不编译它。当然,如果我尝试做类似 auto arr1 = arr;
的操作,它在 g++
下会失败,因为它不知道如何复制 arr
进入 arr1
。
我在 OS X Mavericks 下使用了 macports
的 g++4.9
。此处的实时代码:http://goo.gl/97koLa
我的问题是:
g++
有那么多问题吗?我一直在寻找很多简单的例子,其中 g++
盲目编译非法代码,最后一次是昨天 user-defined conversion operators precedence, compiles in g++ but not clang++ ,并且没有太多的努力,只是为了好玩而尝试 C++
。最佳答案
您的代码不是有效的 C++03。一、表头<array>
不是 C++03 标准库的一部分,但这里也不需要。二、vector对象的构造尝试调用构造函数
explicit vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());
但是val的初始化失败,原因和你不能写的一样
C_array foo = C_array();
据我所知,C++03 标准第 5.2.3 节中的第 2 段仅允许对非数组类型使用此表示法:
The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized (8.5; no initialization is done for the void() case).
此外,g++-4.9.0 也拒绝编译代码,除非在命令行上提供 -std=c++11:
foo.cpp: In constructor ‘std::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]>]’:
foo.cpp:11:32: error: functional cast to array type ‘std::vector<double [10]>::value_type {aka double [10]}’
std::vector<C_array> arr(10);
...
对于 C++11, vector 容器提供了一个额外的填充构造函数:
explicit vector (size_type n);
此构造函数要求模板类型是可默认构造的(请参阅第 23.3.6.2 节)。据我所知,这个要求在 C++11 中也没有得到满足(参见第 17.6.3.1 节),因为为了满足这个要求,表达式 C_array() 必须创建一个临时对象,这在 C+ 中也是无效的+11(再次参见第 5.2.3 节)。我不知道标准是否真的要求编译器拒绝代码,或者如果不满足其中一个要求但标准库的实现不需要它,是否允许编译器编译它。也许对 C++11 了解更多的人可以填补这里的空白。
除此之外,我认为尝试使用数组作为容器元素类型不是一个好主意,因为不满足其他容器要求。例如 C_array 不可复制插入,因此无法复制 vector 。
关于你的第二个问题:请随意浏览 gcc bugzilla 数据库 https://gcc.gnu.org/bugzilla/ .但是,接受无效代码也可以是故意的,例如为了不破坏遗留代码。
关于c++ - g++4.9 错误允许 std::vector<C_type_array>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25109064/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!