数组文字语法怪癖
Array literal syntax quirks
当我使用数组文字时,我在不同的编译器上看到了奇怪的行为。
我面临的第一个问题是当我有这样的程序时:
void f(int*)
{
}
int main()
{
using T = int[];
f(T{1, 2, 3});
}
在Clang 3.5上,这编译得很好,但在g++4.9上,它给出了错误:
source_file.cpp: In function ‘int main()’:
source_file.cpp:8:17: error: taking address of temporary array
f(T{1, 2, 3});
在VC++中,它给出错误:
Process exit code is not 0: 255
所以这很奇怪。
如果我让T
等于int[3]
而不是int[]
,它在VC++上会编译得很好,但在g++上仍然会出现同样的错误。
此外,如果我将代码更改为:
using T = int[];
int* x = T{1, 2, 3};
则clang给出类似于g++的错误。
哪个编译器是对的?
通过使f
的参数为int (&&)[3]
,我找到了如何使它在g++上工作,但在VC++中,它给出了不同的错误。
Clang是对的。构造数组对象是在[expr.type.conv]/3之后形成的,我们不采用数组对象的地址(正如GCC所说),而是让数组到指针衰减,这对于数组来说是允许的,无论值类别:
类型为"NT数组"或"未知界数组"的左值或右值of T"可以转换为"pointer to T"类型的prvalue。结果是指向数组的第一个元素的指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 如何使用字符串文字作为宏参数
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 将数字打印成文字
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 单独定义模板化嵌套类方法的正确语法
- Objective-C 块文字语法原则
- QSqlQuery ctor 或 prepare() 语法,当超过 1 个字符串文字时
- 为什么此输出看起来不确定?(是十六进制文字的冲刺、printf 还是语法?
- 数组文字语法怪癖
- 如何在Vim中从语法高亮显示中排除c++原始字符串文字