[C++]user-providedとuser-declaredの定義について
C++の英語のページ等でたまに見かけるuser-providedとuser-declaredの定義の意味が曖昧だったので調査した。
user-providedの定義
C++20の規格書(N4861) 9.5.2 Explicitly-defaulted functions
にて以下のように書かれていた。
A function is user-provided if it is user-declared and
not explicitly defaulted or deleted on its first declaration
つまり、
以下をどちらも満たす関数がuser-provided型とのこと
- user-declared
- defaultまたはdeleteが明示されていない
user-declaredがそもそもよく理解していないので、そちらも追加で調査した。↓
user-declaredの定義
明確に定義を書いている箇所は見当たらなかったが、
C++20の規格書(N4861) 11.4.5 Copy/move assignment operator
に書かれていた内容から推察できた。
4 If the definition of a class X does not explicitly declare a move assignment operator, one will be implicitly
declared as defaulted if and only if
(4.1) — X does not have a user-declared copy constructor,
(4.2) — X does not have a user-declared move constructor,
(4.3) — X does not have a user-declared copy assignment operator, and
(4.4) — X does not have a user-declared destructor.
[Example: The class definition
struct S {
int a;
S& operator=(const S&) = default;
};
will not have a default move assignment operator implicitly declared because the copy assignment operator
has been user-declared. The move assignment operator may be explicitly defaulted.
struct S {
int a;
S& operator=(const S&) = default;
S& operator=(S&&) = default;
};
この内容を見る限り、以下がuser-declared関数。
- コンパイラが暗黙的に定義する関数ではなく明示的にユーザーが書いた関数のこと。
これにはdefaultやdeleteの指定が付いている関数も含まれる。
Discussion