💡

[C++]user-providedとuser-declaredの定義について

2023/05/04に公開

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