簡體   English   中英

非constexpr可構造類的constexpr成員函數

[英]constexpr member function of non constexpr constructible class

如果非文字類類型沒有constexpr構造函數(它不是constexpr構造的),那么非靜態constexpr成員函數是否有意義? 我的意思是如果你不能在編譯時構造對象,你將如何使用其成員函數?

無論如何,主要的編譯器都沒有抱怨它,這讓我覺得它是標准所允許的。

不過,您可以在運行時使用此類constexpr成員函數而不會出現任何問題。 現在唯一的問題是constexpr在這種情況下的效果是什么,如果有的話。 我最好的猜測是, constexpr成員的返回值正在編譯時進行評估(如果可能的話),因此在運行時調用時,它必須進行簡單的復制。

我的猜測是正確的,還是constexpr說明符在這種情況下絕對沒有意義(即成員函數在運行時被評估)?

您的問題的前提似乎是只能在編譯時評估constexpr函數。

這個前提是不正確的。 編譯器可以預先計算它可以找到的任何方法,只要產生確切的副作用和副作用(如果規則)。

constexpr提供的是保證某些表達式將在編譯時由每個編譯器進行評估(它不是“實現質量”問題),這使得可以在需要編譯時值的上下文中使用它們,例如作為非類型模板參數, switch語句中case子句的操作數等。

constexpr函數的具體細節包括必須至少有一組參數(目標實例是隱含參數),以便滿足constexpr評估規則。 如果不是這樣,那么您的程序格式不正確,並且根本沒有指定其運行時行為,因此不要將constexpr添加到邏輯上不屬於的地方。

但是,編譯器不需要診斷違反此規則的行為。 這意味着“主要編譯器不會抱怨它”不應該被解釋為保證代碼是正確的。


標准的措辭,第7.1.5節(草案n4582)

對於既不是默認也不是模板的constexpr函數或constexpr構造函數,如果不存在參數值,則函數或構造函數的調用可以是核心常量表達式的計算子表達式,或者對於構造函數,可以是常量初始化函數。一些對象,該程序是不正確的; 無需診斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM