gpt4 book ai didi

c++ - ‘struct’ 之前的预期主表达式

转载 作者:行者123 更新时间:2023-12-01 14:05:05 25 4
gpt4 key购买 nike

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关键字是彻头彻尾的有害,我从没想过会这样。
由于两个不同的编译器以完全相同的方式拒绝代码,我最好的猜测是我错过了一些信息,而不是这是一个错误。

最佳答案

type{…}语法,如 type(…) , 需要 单例 , 未详细说明的类型说明符。这可能相当复杂:

auto x=typename A::template B<int>();  // OK
但是,它不能包含运算符或前缀说明符:
// All bad:
auto a=int*{};
auto b=const int();
auto c=struct X{}; // a class definition?
auto d=struct Y {}(); // still not allowed
auto e=signed char();

auto f=signed(); // OK, means int
这种情况当然可以通过 decltype处理。或者通过引入 typedef 名称:
void f(void());
void f(int*);
struct x {};
void g(x);
void g(unsigned long);
void h() {
// Ambiguous:
// f(nullptr);
// Illustrative of the parsing difficulty:
// f(void(*)()());
f(decltype(&h)());
int x; // oh noes
using y=struct x;
g(y());
g(decltype(1ul)()); // same as g(0);
}

关于c++ - ‘struct’ 之前的预期主表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63349901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com