@ Yakkと@ T.Cのおかげです。その説明のために。私は例が物事をより明確にすべきであると感じ:
struct wrapper {
int value;
// non-explicit constexpr constructor
constexpr wrapper(int v) noexcept : value(v) {}
// non-constexpr copy & move constructors
wrapper(const wrapper& that) noexcept : value(that.value) {}
wrapper(wrapper&& that) noexcept : value(that.value) {}
};
constexpr wrapper make_wrapper(int v)
{
return {v};
}
int main()
{
constexpr auto x = make_wrapper(123); // error! copy/move construction,
// but no constexpr copy/move ctor
constexpr int y = make_wrapper(123).value; // ok
static_assert(y == 123, ""); // passed
}
のでmake_wrapper
が正常constexpr wrapper
を返すん。 constexpr
コピー/移動コンストラクタがないので、コードがコンパイルされないようにするのは、コピー/移動のコンストラクションです(通常はコンパイラによって省略されます)。
返された(一時的な)wrapper
オブジェクトのメンバ値を使用してconstexpr
変数を初期化することによって、constexpr
の状態を確認できます。
この質問に疑問はありません。 – immibis
@immibis更新された:) –
cppreferenceは、その「constexpr」を薄い空気から取り戻しませんでした。あなたは知っています... –