为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C
为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时?为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C,c++,C++,为什么是g++;抱怨;“之前的声明符无效;,将可调用对象作为参数传递时? #包括 #包括 #包括 结构可调用{ void运算符()(){ STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C>是一个保留的标识符。只需更改该函数的名称,代码就可以工作。 登记器< /C>是C++的一个关键词。@重写,作为标识符,在特殊位置具有特殊含义,这样它就不会成为保留字。(我以前在自己的编译器fiddlings中使用过这个技巧,所以这对我来说并不
#包括
#包括
#包括
结构可调用{
void运算符()(){
STD::C++错误消息并不能真正解决问题,但是编译器实际上没有更多的说明。问题是代码>登记器< /C>是一个保留的标识符。只需更改该函数的名称,代码就可以工作。 <代码>登记器< /C>是C++的一个关键词。@重写
,作为标识符,在特殊位置具有特殊含义,这样它就不会成为保留字。(我以前在自己的编译器fiddlings中使用过这个技巧,所以这对我来说并不完全是新的。)所以,我只半同意你…;-)@Scheff Fair,但是override
是一个上下文关键字,所以它不那么重要。非上下文关键字要复杂得多。举一个非常不幸的例子,yield
前面有一个co
:(@Scheff用英语以外的另一种语言命名所有东西(例如像我这样的德语)是避免这种冲突的好方法。register
会变成registriere
,因此不会发生冲突。@nada抱歉,不会,永远不会。:-)我不喜欢这种混杂的东西。我不得不在每日广播新闻和广告中忍受这种情况,但我不想在我精心编写的源代码中看到它。实际上,clang给出了更多的提示(),但gcc喜欢在这里保持神秘……这确实是一个意外的根本原因……@magnize_prime_是_463035818哦,很好的观点。叮当声错误仍然是无用的,警告是因为寄存器
被弃用:p将其更改为无效,例如,叮当声再次完全没有帮助。fwiw with-std=C++17
Clangs警告是一个错误。使用gcc-Werror-Wall
也不会让它变得更好。我想这是一个不会犯的错误often@largest_prime_is_463035818是的,没错。事实上,我对有人在这个问题上已经投错的简历感到不舒服。
#include <iostream>
#include <vector>
#include <functional>
struct Callable {
void operator()() {
std::cout << "hello world\n";
}
};
std::vector<std::function<void()>> cbs;
void register(std::function<void()>&& cb) { // <-- ERROR
cbs.emplace_back(std::move(cb));
}
int main() {
Callable c;
register(std::bind(std::ref(c)));
for (auto& cb : cbs) {
cb();
}
return 0;
}