最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# 無意味なexport宣言を禁止する [P2615R1](C++23)

このページはC++23に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++20時点でのモジュール定義では、いくつかの不必要なexport宣言ができてしまっていた。

    template export void f();
    export template void f();
    export template<> void g(int);
    template<> export void g(int);
    export template<class T> struct trait<T*>;

C++23では、本来必要のない以下の宣言に対するexport宣言を禁止する：

- 明示的なインスタンス化
- 明示的な特殊化
- export宣言

ただし、この変更のあとでも、`export { … }`で囲まれた中では、これらが含まれていてもコンパイルエラーにはならない。

## 関連項目

- C++20 モジュール

## 参照

- P2615R1 Meaningful exports
- CWG Issue 2443. Meaningless template exports