- 环境:x86-64 Clang 6.0.0
函数的定义:
void foo(const char*) {}
-
foo(char[16]{}); //houston, there is a problem!
-
foo(type_alias<char[16]>{}); //compile happily
type_alias
很简单:
template<typename T>
using type_alias = T;
作为注释,case 1
case 2
时无法编译能够。
我知道alias declarations
与 using
不是文本替换(如 #define
),它是该类型的同义词。
但我仍然不知道如何解释这种情况。然后我给 GCC 一个 try
:
prog.cc: In function 'int main()':
prog.cc:11:7: error: expected primary-expression before 'char'
foo(char[16]{});
^~~~
prog.cc:12:7: error: taking address of temporary array
foo(type_alias<char[16]>{});
^~~~~~~~~~~~~~~~~~~~~~
啊,GCC 却给了我一个错误!然后我用两个编译器的不同版本编译它:
- Clang 的错误消息
case 1
是:
prog.cc:11:11: error: expected '(' for function-style cast or type construction
foo(char[16]{}); ~~~~^
Clang 让
case 2
经过。GCC 禁止这两个案例通过竞争。
case 1
的错误消息和case 2
已在上面列出。
顺便说一句,对于 Clang,我还用 pedantic-errors
进行了测试,但没有任何改变。
问题:
- 对于
case 2
: Clang,GCC,谁符合标准?任何标准(语言律师)规范? - 对于
case 1
: 谁的错误信息更正确(IOW,符合标准)?
更新
作为 VTT 评论,case 1
,应该是foo(const char[16]{});
.为这个错误道歉。
但是Clang可以编译foo(type_alias<char[16]>{});
.这似乎是一个错误?
最佳答案
嗯,type_alias<cv T>{}
相当于(cv T){}
,而不是cv T{}
.当 T
时,这种区别很重要是一个数组:
foo((const char[16]){}); // OK
foo(type_alias<const char[16]>{}); // OK
foo(const type_alias<char>[16]{}); // KO
foo(const char[16]{}); // KO
演示:https://wandbox.org/permlink/KGf3HVqN3USq6yy8
For case 2: Clang, GCC, who conforms the standard? Any spec in standard(language lawyer)?
两者都接受,都接受foo(type_alias<char>[16]{})
,但是 gcc 警告 你(因为你用 -Werror
编译,这个警告变成了错误;)。
关于c++ - 函数参数中的 `type_alias<char[N]>{}` VS `char[N]{}`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50679635/