Skip to content

Commit

Permalink
fix: CWG 2518/P2593R1 を反映 (#1257)
Browse files Browse the repository at this point in the history
  • Loading branch information
yumetodo committed Feb 25, 2024
1 parent 426105d commit 79fc60a
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
7 changes: 5 additions & 2 deletions lang/cpp11/static_assert.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ static_assert(定数式, 文字列リテラル);
- この宣言は、名前空間スコープ、ブロックスコープ、メンバ宣言といった場所で記述できる
- 定数式が真であると評価された場合は何も効果がない。定数式が偽であると評価された場合は、指定された文字列リテラルを含む診断メッセージがコンパイラによって問題報告される。ただし、基本ソース文字集合に含まれない文字集合は、診断メッセージに表示することはコンパイラに要求されない
- `static_assert`宣言では、新たな型やオブジェクトは宣言しない。また、実行時にサイズや時間コストは発生しない

- (C++23以降 or CWG 2518が適用された環境): template文(もしくは適切な特殊化や[C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の中の文)が実際にインスタンス化されるまで、`static_assert`文の宣言は遅延される。

This comment has been minimized.

Copy link
@yohhoy

yohhoy Feb 26, 2024

Member

CWG2518は Defect Report 扱いと明言されているため、C++23への言及なしに単に「CWG2518が適用された環境」で良いと思います。他箇所も同様。

This comment has been minimized.

Copy link
@yumetodo

yumetodo Feb 26, 2024

Author Member

49f9140 で修正しました

- [C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の解説を参照

##
```cpp example
Expand Down Expand Up @@ -79,6 +80,7 @@ Boost Static Assertion Libraryが開発されたときに、コンパイル時
## 関連項目
- [C++17 `static_assert`のメッセージ省略を許可](/lang/cpp17/extending_static_assert.md)
- [C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)
- [C++23 定数式の文脈での`bool`への縮小変換を許可](/lang/cpp23/narrowing_contextual_conversions_to_bool.md)
Expand All @@ -87,4 +89,5 @@ Boost Static Assertion Libraryが開発されたときに、コンパイル時
- [N1604 Proposal to Add Static Assertions to the Core Language (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1604.html)
- [N1617 Proposal to Add Static Assertions to the Core Language (Revision 2)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1617.html)
- [N1720 Proposal to Add Static Assertions to the Core Language (Revision 3)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html)
- [P2593R1: Allowing static_assert(false)](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2593r1.html)
- [Issue 2518: Conformance requirements and #error/#warning - WG21 CWG Issues](https://wg21.cmeerw.net/cwg/issue2518)
27 changes: 27 additions & 0 deletions lang/cpp17/if_constexpr.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,30 @@ int main()
}
```
### (C++23以降 or CWG 2518が適用された環境) `static_assert`文に関する例外
上に述べたように、`constexpr if`文の中の文は破棄文においても、非依存名の検証を行う。このため特に`static_assert`文を使う時に直感的ではない挙動を示していた。

This comment has been minimized.

Copy link
@akinomyoga

akinomyoga Feb 25, 2024

Member

破棄文

if constexpr を更新した時に discarded statement の訳語は廃棄文とすることにしていました。

#665 (comment)


後この節の内容は前の節の "2段階名前探索における注意点" とちゃんと統合するべきの気がします。つまり、"2段階名前探索における注意点" の中で今「static_assert(false) はダメ」って説明しているところで CWG 2518 以降は例外として static_assert(false) OKってことも言うべきの気がします。

でも…遡って適用ならば、むしろ、説明は逆の方が良い気がします。つまり、最初の説明で static_assert(false) はOKって説明して、但し書きで CWG 2518 適用以前はダメだったという具合に。

This comment has been minimized.

Copy link
@yohhoy

yohhoy Feb 26, 2024

Member

文章再構成が必要なため悩ましいところですが、私も akinomyoga さんと同意見です。

遡って適用ならば、むしろ、説明は逆の方が良い気がします。つまり、最初の説明で static_assert(false) はOKって説明して、但し書きで CWG 2518 適用以前はダメだったという具合に。

(本コミット時点でも読者への情報提供はできるため、 #1257 としては一旦closeしても良いかもしれません。)

C++23以降、もしくはCWG 2518が適用された環境においては、template文(もしくは適切な特殊化や`constexpr if`文の中の文)が実際にインスタンス化されるまで、`static_assert`文の宣言は遅延される。
```cpp example
#include <cstdint>
template <class T>
void f(T t) {
if constexpr (sizeof(T) == sizeof(std::int32_t)) {
use(t);
} else {
static_assert(false, "must be 32bit");
}
}
void g(std::int8_t c) {
std::int32_t n = 0;
f(n); // OK: nはstd::int32_t型なので`use(t);`のほうがインスタンス化されるために、static_assert文は宣言されない。
f(c); // error: cはstd::int8_t型なので、static_assert文は宣言され、"must be 32bit"とコンパイラが診断メッセージを出力する
}
```

### 類似機能との比較

`constexpr if`文の導入によってC++の`if`系の条件分岐は3種類になった。
Expand Down Expand Up @@ -429,6 +453,7 @@ template <int arg, typename ... Args> int do_something(Args... args) {
- [P0292R1: constexpr if: A slightly different syntax](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r1.html)
- [P0292R2: constexpr if: A slightly different syntax](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r2.html)
- [N4603 Editor's Report -- Committee Draft, Standard for Programming Language C++](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4603.html)
- [P2593R1: Allowing static_assert(false)](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2593r1.html)

### 2段階名前探索における注意点について

Expand All @@ -439,7 +464,9 @@ template <int arg, typename ... Args> int do_something(Args... args) {

### その他

- [C++11 コンパイル時アサート](/lang/cpp11/static_assert.md)
- [Static If I Had a Hammer - Andrei Alexandrescu](http://web.archive.org/web/20201202042515/https://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Static-If-I-Had-a-Hammer)
- [C++1z if constexpr文 - Faith and Brave - C++で遊ぼう](https://faithandbrave.hateblo.jp/entry/2016/12/22/171238)
- [[cfe-dev] Clang getting involved](https://lists.llvm.org/pipermail/cfe-dev/2014-March/035801.html)
- [`__if_exists` Statement | Microsoft Docs](https://docs.microsoft.com/ja-jp/cpp/cpp/if-exists-statement)
- [Issue 2518: Conformance requirements and #error/#warning - WG21 CWG Issues](https://wg21.cmeerw.net/cwg/issue2518)

0 comments on commit 79fc60a

Please sign in to comment.