gpt4 book ai didi

c++ - 不寻常的编译器错误转换为无效?

转载 作者:可可西里 更新时间:2023-11-01 16:36:45 25 4
gpt4 key购买 nike

我正在为我正在教授的类(class)整理基于 C++ 的作业。我有一个函数要导出给学生,我希望他们在程序的不同点调用它,以便在评分期间,我们可以拦截这些调用以确保他们在正确的时间做正确的事情.我不希望该代码在提供的起始文件中做任何事情,所以我只是给函数一个主体,它只有一系列语句,将所有参数转换为 void 以抑制编译器警告未使用的参数。在这样做的过程中,我遇到了一个我以前从未见过的不寻常的编译器错误,并且对该站点的搜索没有找到任何有用的信息。

this reduced test case 可以很好地说明该错误:

void iDontUseMyArguments(int a, int b) {
(void) a; // Explicit cast to void - totally fine!
(void) b;
}

void iDontEither(int a, int b) {
(void) a, b; // Comma expression casted to void, though technically
// b isn't casted to void!
}

void norDoI(int a, int b) {
void(a, b); // ERROR! No idea why this isn't okay.
}

void meNeither(int a, int b) {
(void)(a, b); // Comma expression casted to void - totally fine!
}

void jumpOnBandwagon(int a, int b) {
void((a, b)); // Comma expression casted to void - totally fine!
}

如您所见,其中大部分都可以正常编译。问题出在这个问题上:

void(a, b);

这会触发以下错误:

prog.cpp: In function 'void norDoI(int, int)':
prog.cpp:11:11: error: expression list treated as compound expression in functional cast [-fpermissive]
void(a, b);
^

我从未遇到过此错误消息,所以我不确定这是要告诉我什么。

这条线背后的意图

void(a, b);

是一个包含 ab 的逗号表达式,然后使用函数式转换将其转换为 void 类型。如您所见,以下变体都有效:

(void)(a, b);
void((a, b));

我怀疑这可能与 Most Vexing Parse 有关,并且这被解释为声明,但我遇到的特定错误似乎与此不符。

我的问题如下:

  1. 确切地说,为什么这段代码不合法​​?
  2. 编译器认为我要做什么?
  3. 确切地说,为什么这些其他变体是合法的?

最佳答案

给定这个结构:

struct S {
S(int, int) {}
};

什么是S(1, 2)什么意思?

答案:意思是你构造了一个S类型的对象来自值 12 .


给定这个函数模板:

template <typename T> T f() { return T(1, 2); }

什么是T(1, 2)什么意思?

答案:意思是你构造了一个T类型的对象来自值 12 ,这是可能的,如果 T例如类型 S从第一个问题开始。


给定相同的函数模板,然后做什么 f<void>()什么意思?

答案:它试图构建一个单一的 void来自两个值的值 12 .这会失败,因为只能将单个值转换为 void .


是否 void(1, 2)表示与 T(1, 2) 不同的任何内容什么时候T恰好是 void

回答:不对,意思完全一样,所以是错误的。

关于c++ - 不寻常的编译器错误转换为无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749235/

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