2016-10-13 60 views
2

按照[dcl.constexpr/3]constexpr和function body = delete:目的是什麼?

一個constexpr函數應滿足下列要求的定義:
[...]
- 其功能體應爲=刪除,=默認情況下,或[。 ..

這意味着下面的類代碼段是有效的:

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

刪除constexpr函數的目的是什麼?
定義它有什麼好處constexpr如果有的話?

我找不出任何理由,但事實上,允許它比在標準中禁止它更容易。

+0

刪除任何函數是一種簡單的方法來禁用特定的過載。我想它也應該適用於「constexpr」系列的功能。 – StoryTeller

+0

'constexpr'函數返回'void'也是* 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

相關問題