出现 void value not ignored as it ought to be 错误是因为函数返回值为 void 类型,而你对这个 void 类型的“返回值”进行了操作(包括赋值、强制转换、运算等),通常人们说出现这个错误是因为你给某个变量赋值了 void 返回类型的函数值,例如:
voidfunc()
{}
【资料图】
inti = func()
由于 func() 返回值类型为 void ,因此 func() 不能赋值给任何变量,否则编译器会报错 void value not ignored as it ought to be 。
但在实践中这个错误可能不是以这样明显的方式出现,近日我在使用CRTP时候,发现如下代码会报错 void value not ignored as it ought to be
仔细一看好像没有什么问题,但编译时会报错 void value not ignored as it ought to be ,这个问题困扰了我很久,后来我发现可能是因为运算优先级导致的,即上面的代码实际被解释为
(Derived*)( this->initialize() );
即先调用 this->initialize() ,然将其返回的 void 强制转换为 Derived* 指针,很显然这是在对 void 进行强制转换,是错误的,正确的写法应该是
此时编译器将通过编译。
但还有一个比较疑惑的问题是,下面的代码没有将 (Derived*)this 括起来,但是却成功通过编译并运行了,我还不知道为什么,希望有知道的朋友可以在评论区解惑,感激不尽!
总的来说为了安全起见,最好是写成 ((Derived*)this)->initialize(); 的形式,这个括号不加有可能不报错也有可能报 void value not ignored as it ought to be ,但多加个括号一定不会出错。