簡體   English   中英

使用 noexcept 的程序被 msvc 和 clang 接受但被 gcc 拒絕

[英]Program using noexcept accepted by msvc and clang but rejected by gcc

我正在使用此處列出的書籍學習 C++。 特別是,我最近使用C++ 入門一書了解了 noexcept noexcept 現在,為了進一步理清我對該主題的概念並確認我理解正確,我正在編寫簡單的程序。 下面給出了一個使用 MSVC 和 Clang 但不使用 GCC 編譯的程序。 演示

void f() noexcept(5) //accepted by msvc but rejected by gcc
{

}

所以我的問題是哪個編譯器就在這里(如果有的話)?

以下是一些主要編譯器的結果:

編譯器 C++版 接受代碼
GCC C++17
GCC C++20
Clang C++17 是的
Clang C++20
MSVC C++17 是的
MSVC C++20 是的

正如我們所看到的,該程序適用於某些編譯器,但不適用於其他編譯器。 gcc 中的錯誤表示: error: narrowing conversion of '5' from 'int' to 'bool'

TLDR

該程序noexcept-specifier錯誤,並且相應的編譯器在接受代碼時是錯誤的,因為 int prvalue 表達式5不是bool類型的上下文轉換常量表達式,它(如果提供)需要是noexcept-的上下文轉換常量表達式noexcept-specifier 基本上,程序格式錯誤的原因與bool b{5};的原因相同。 也是病式的,即,這涉及到縮小轉換


來自異常規范文檔

1)異常規范要么隱式定義,要么通過使用 noexcept-specifier 作為 function 聲明符的后綴顯式定義

noexcept-specifier: noexcept ( constant-expression ) noexcept throw ( )

2)在 noexcept-specifier 中, constant-expression,如果提供的話,應該是 bool 類型的上下文轉換常量表達式 該常量表達式是 function 類型的異常規范,其中出現了 noexcept-specifier。

(強調我的)

這意味着為了使程序格式正確,提供的常量表達式(在我們的示例中為5 )需要是bool 類型的上下文轉換常量表達式

現在讓我們從expr.const#4查看5是否是上下文轉換的常量表達式:

4.10) A contextually converted constant expression of type bool 是一個表達式,contextually converted to bool, where the converted expression is a constant expression and the conversion sequence only contains the conversions above .

4.7)縮小轉換以外的整數轉換,

縮小轉換

縮小轉換是隱式轉換

  • 從 integer 類型或無范圍枚舉類型到 integer 類型不能表示原始類型的所有值,除非源是常量表達式,其整數提升后的值將適合目標類型

(強調我的)

這意味着從 int prvalue 5到 bool true的轉換是收縮轉換,因此5不是 bool 類型的上下文轉換常量表達式,因此程序格式錯誤,並且相應的編譯器在接受代碼時是錯誤的。

基本上,程序格式錯誤的原因與bool b{3};的原因相同。 是病式的。 你甚至可以看到你會得到同樣的錯誤。 演示


這是 msvc 錯誤報告:

MSVC 接受無效的縮小轉換

這是 clang 錯誤報告:

Clang 接受無效的縮小轉換

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM