【发布时间】:2020-08-11 00:37:23
【问题描述】:
GCC 8.3.0 和 clang 9.0.1 都无法编译这个简短的示例代码:
#include <cstdlib>
template <typename T>
struct mystruct {
T data;
};
int main (const int argc, const char * const * const argv) {
int ret = EXIT_SUCCESS;
auto elem1 = struct mystruct<bool> { }; // Doesn't compile.
auto elem2 = mystruct<bool> { }; // Does compile.
return (ret);
}
出现的错误信息:
teststruct.cpp: In function ‘int main(int, const char* const*)’:
teststruct.cpp:11:16: error: expected primary-expression before ‘struct’
auto elem1 = struct mystruct<bool> { }; // Doesn't compile.
^~~~~~
teststruct.cpp:11:16: error: expected expression
auto elem1 = struct mystruct<bool> { }; // Doesn't compile.
^
我不明白为什么第一个表达式似乎是某种非法语法。
据我所知,struct 关键字在 C++ 中基本上可以省略除非有歧义。这往往会发生(例如,对于[struct] stat,它可以是结构或函数),因此struct 关键字可以而且应该用于在这种情况下消除歧义。
然而,在我的示例中,使用 struct 关键字是完全有害的,我从没想过会这样。
由于两个不同的编译器以完全相同的方式拒绝代码,我最好的猜测是我遗漏了一些信息,而不是这是一个错误。
【问题讨论】:
-
只是猜测,但我相信您只是在调用 mystruct 的构造函数,因此将 struct 关键字放在那里对编译器没有意义。这段代码我得到了同样的错误:struct test { int data; } int main() { auto temp = struct test; }
-
可以加括号为
auto elem1 = (struct mystruct<bool>) { };。 -
是的,但没有。我正在创建一个
[struct] mystruct类型的新对象,初始化为初始化列表中提供的值(恰好是空的,所以初始化为零),然后将其复制到原始变量中。当然,副本是多余的,但这不是重点。但是,到目前为止,您的观点感兴趣的是编译器可能不会将struct mystruct<T>视为一种类型,而是将其视为其他东西,这可以通过将类型包装在括号中来解决。不过……这听起来很奇怪。 -
这对于创建任何多字类型的临时文件都是一样的。
f(long long{1})fails similarly. -
@songyuanyao:这是一个复合文字,不是 C++(但通常支持 C99 兼容性)。