2016-10-13 1 views
2

[dcl.constexpr/3]によると:constexprとfunction body = delete:目的は何ですか?

constexprの関数の定義は、次の要件を満たすものとする:
を[...]
- その機能-体は=デフォルト、または[削除=しなければなりません。 ..]

これは、以下のクラスのスニペットが有効であることを意味します

struct S { 
    constexpr void f() = delete; 
}; 

削除されたconstexpr機能を持つ目的は何ですか?
constexprがある場合、それを定義する利点は何ですか?

私は何らかの理由を理解することはできませんが、標準でそれを禁止するよりも許可するほうが簡単かもしれないという事実はわかります。

+0

'delete'ing関数は、特定のオーバーロードを無効にする簡単な方法です。私は 'constexpr'ファミリーの関数にも同様に適用されるべきだと思います。 – StoryTeller

+0

'void'を返す関数の' constexpr'も* fun *です。 – Jarod42

+0

@ Jarod42Touché。 mvceを作成するために使用され、それは問題ありませんが、それは確かに意味があります。 – skypjack

答えて

3

これはCWG 1199に基づいています。ダニエルKrüglerが書いた:

機能がconstexpr等が削除されるのいくつかでは、コードの単一片が複数の構成で使用される場合にこのフォームを可能にするために有用であり得ます。 constexpr指定子を削除する関数の宣言をすべて更新する必要があり、不必要に煩わしいものです。

+0

遅かれ早かれ、問題を突き止める方法を教えてください。私は私が探していたものを見つけることが決してなかった!それは、私はそのような場合を把握することはできません。あなたは最小の例を提供できますか? – skypjack

+0

@skypjackわからない、tbh。 – Barry

+2

可能[例](http://coliru.stacked-crooked.com/a/e29e6fb25d185488)? – Jarod42

1

私は目的がどの=deleteと同じだと思います:

あなたはクラスから継承しますが、機能は、サブクラスで利用できるようにしたくない場合。

例えば:それは便利です私は今あなたを伝えることができないにもかかわらず

class P{ 
    public: 
    constexpr int foo(){return 42;} 

}; 

class C : public P{ 
    public: 
    constexpr int foo() = delete; //(*) 
}; 

int main() { 
    P p; 
    cout << p.foo(); //ok 

    C c;  
    cout << c.foo(); //Compiler error only if line (*) is present. 
    return 0; 
} 

- しかし、それは禁止されるべきなぜ私はまた、今どのような理由を見ることができません。

+0

'C 'から' constexpr'を削除しても結果は同じです。 – skypjack

関連する問題