[英]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.