constexpr上下文中的std :: Optional赋值运算符

时间:2018-08-19 19:09:40

标签: c++ c++17 optional constexpr libstdc++

我正在摸索着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

有什么我想念的吗?

1 个答案:

答案 0 :(得分:5)

这似乎是gcc中的错误。我刚在clang-6.0中尝试过,编译失败并出现预期的错误。另外,该标准没有提及赋值运算符的任何constexpr重载,因此我将将此错误报告给gcc bugtracker。

Link to the bug report


编辑:

事实证明,这不是gcc中的错误,而是标准中的错误:

  
    

当当前的c ++ 17标准未指定任何constexpr赋值运算符时,我不理解代码片段如何在constexpr上下文中工作。

  
     

是的,但是标准被打破了。

     

所有实现都将赋值运算符定义为默认值,因此编译器将其设为constexpr。

     

实际上,P0602R3提议是相关的,因为它会需要实现,以将操作符定义为默认操作符(以使其变得微不足道),因此编译器将始终采用该提议constexpr for std :: optional。

     

我已向标准委员会提出。

您可以在the bug report中了解更多信息。