[英]Program with “noexcept” constructor accepted by gcc, rejected by clang
[英]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'
該程序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 錯誤報告:
這是 clang 錯誤報告:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.