函数的定义:
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;
live demon https://godbolt.org/g/6MmABg
正如评论指出的那样,case 1
无法编译case 2
can.
我知道alias declarations
with using
不是文本替换(比如#define
) 并且它是类型的同义词。
但我仍然不知道如何解释这种情况。然后我给GCC a try https://wandbox.org/permlink/RKLfaLiEU4HnW6HS:
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]>{});
^~~~~~~~~~~~~~~~~~~~~~
Ah, GCC相反给了我一个错误!然后我用两个编译器的不同版本来编译它:
prog.cc:11:11: 错误:函数式转换或类型构造需要 '('
foo(char[16]{});
~~~~^
顺便说一句,对于Clang,我也测试过pedantic-errors
,但没有任何改变。
问题:
- For
case 2
: Clang, GCC,谁符合标准?标准(语言律师)有什么规范吗?
- For
case 1
: 谁的错误信息更正确(IOW,符合标准)?
Update
正如 VTT 评论的那样,对于case 1
, 它应该是foo(const char[16]{});
。为这个错误道歉。
But Clang可以编译foo(type_alias<char[16]>{});
。好像是个bug?