我正在摸索着public function beforeSave($insert) {
if( !parent::beforeSave($insert) ){
return false;
}
//your custom code
if( !$insert ){
$ifAttributesChanged = (!empty($this->dirtyAttributes) );
//if attributes were changed
if( $ifAttributesChanged ){
//add new record with the new values
$book = new self();
$book->attributes = $this->attributes;
$book->save();
//add back the old values of the changed attributes
//to the current record so nothing is changed for the current record
foreach( $this->dirtyAttributes as $attribute => $value ){
$this->$attribute = $this->oldAttributes[$attribute];
}
//disable the current record
$this->status = 0;
//backup old record
$backup = new BackupBooks();
$backup->book_id = $this->id;
$backup->name = $this->name;
$backup->save();
}
}
return true;
}
,据the docs称,它不应该有std::optional
赋值运算符。
但是,当我在gcc-8.1中尝试此代码段时,它可以编译并正常工作:
constexpr
有什么我想念的吗?
答案 0 :(得分:5)
这似乎是gcc中的错误。我刚在clang-6.0中尝试过,编译失败并出现预期的错误。另外,该标准没有提及赋值运算符的任何constexpr
重载,因此我将将此错误报告给gcc bugtracker。
编辑:
事实证明,这不是gcc中的错误,而是标准中的错误:
当当前的c ++ 17标准未指定任何constexpr赋值运算符时,我不理解代码片段如何在constexpr上下文中工作。
是的,但是标准被打破了。
所有实现都将赋值运算符定义为默认值,因此编译器将其设为constexpr。
实际上,P0602R3提议是相关的,因为它会需要实现,以将操作符定义为默认操作符(以使其变得微不足道),因此编译器将始终采用该提议constexpr for std :: optional。
我已向标准委员会提出。
您可以在the bug report中了解更多信息。