'type_alias<char[N]>{}' VS 'char[N]{}' in function's arguments
`type_alias<char[N]>{}` VS `char[N]{}` in function's argument
- 环境:x86-64Clang6.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;
live demon
如注释所示,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
的错误消息为:
程序cc:1:11:错误:函数样式强制转换或类型构造应为"(">
foo(char[16]{}); ~~~~^
Clang让
case 2
通过。GCC禁止这两种情况通过竞争。上面列出了
case 1
和case 2
的错误消息。
BTW,对于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
对于案例2:Clang,GCC,谁符合标准?标准中有什么规范吗(语言律师)?
两者都接受foo(type_alias<char>[16]{})
,但gcc会向发出警告(由于使用-Werror
进行编译,因此此警告会变为错误;)。
相关文章:
- 请求成员 'begin' in 'c' 中,它是非类类型 'char [101]' sort(c.begin(), c
- 'type_alias<char[N]>{}' VS 'char[N]{}' in function's arguments
- Concatenate char[] and uint32_t in C++
- c++ char c[256] in getLine
- 您如何访问 const char **& in C++ 中的数据?
- 转换LPVOID IN CHAR错误C2440:=
- 包装一个使用char**[in/out]的C函数调用,以在cython中返回一个python列表
- const char* to LPCWSTR in Qt
- std::string {aka std::basic_string<char>}' 到 'char*' in assignment|
- ASCII Dec to Char in C++
- "incompatible types in assignment of 'char' to 'char'[100]"我使用的是 strcat 对吗?
- 初始化c++中的char* in结构体
- what does ++operator do in this void uart_puts(unsigned char
- Char to Int in C++?
- for 循环中的 C++ 内存分配 in<char> for 循环中的向量
- 如何将char* in结构从c#传递到c++
- "Search words/strings in Matrix of Char"算法的复杂性
- char* and cin in C++
- char and String in c++
- 如何向FILE类注入const char* in