c++ - 函数参数中的 `type_alias<char[N]>{}` VS `char[N]{}`

标签 c++ gcc arguments clang language-lawyer

  • 环境:x86-64 Clang 6.0.0

函数的定义:

void foo(const char*) {}
  1. foo(char[16]{}); //houston, there is a problem!
  2. foo(type_alias<char[16]>{}); //compile happily

type_alias很简单:

template<typename T>
using type_alias = T;

live demon


作为注释,case 1 case 2 时无法编译能够。

我知道alias declarationsusing不是文本替换(如 #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]{});
      ~~~~^
  • Clangcase 2经过。

  • GCC 禁止这两个案例通过竞争。 case 1 的错误消息和 case 2已在上面列出。

顺便说一句,对于 Clang,我还用 pedantic-errors 进行了测试,但没有任何改变。


问题:

  • 对于 case 2 : ClangGCC,谁符合标准?任何标准(语言律师)规范?
  • 对于 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/

相关文章:

c++ - Allegro 获取当前窗口大小

c++ - 写入纹理数组的一层并从另一层读取

c++ - 用 GCC 编译 WIN32 代码

linux - 在linux中如何控制gcc生成的文件的权限?

c++ - 为什么按值传递而不是按常量引用传递?

c++ - 错误代码与错误条件

c++ - 无法添加静态库

c - __builtin_clz 的实现

ruby - 如何将 (2-∞) 个参数传递给 ruby​​ 方法?

python - 在 Python 中将多个参数传递给 C 函数