2016-06-21 35 views
7

This page, C++ 17'deki make_optional işlevinin constexpr optional<...> değerini döndürdüğünü belirtir. Sanırım (yanlış olsa da) bu, optional<T>'un bir constexpr kopyasına sahip olmasını veya kurucuyu taşımasını gerektirir. Ancak, this page da böyle olmadığını söylüyor.C++ 17 make_optional constexpr-ness

Şu anda geçerli olan C++ 1z taslağı olarak nasıl make_optional uygulanabileceğini bilmiyorum. Açıklama için this post'a bakın. Bazı geçici çözüm var mı, yoksa belki de sadece standart taslak/cppreference'ın hatası mı?

+0

Bu soruyla ilgili soru sorulmamaktadır. – immibis

+0

@immibis Güncelleme :) –

+1

cppreference 'constexpr' ince hava dışında, biliyorsunuz bilmiyordum ... –

cevap

2

@Yakk ve @ T.C'ye teşekkürler. açıklamaları için.

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 
} 

Yani make_wrapper başarıyla constexpr wrapper çıkmıyor;: Her şeyin daha net hale gereken bir örnektir hissetmek constexpr kopyalama/taşıma yapıcısı olmadığından, kodun derlenmesini engelleyen kopyalama/taşıma yapısı (genellikle derleyiciler tarafından seçilse de).

constexpr değişkenini başlatmak için üye değerini kullanarak (geçici) wrapper nesnesinin constexpr nesnesini doğrulayabiliriz.

1

Geri dönüş değerlerini C++ 11'de return {something}; ile doğrudan yapılandırabilirsiniz constexpr olan açık olmayan herhangi bir kesişme varsa, onu bir işlevden döndürebilirsiniz.

+0

Sanırım bu, kopyalama elemesinden kaynaklanan bir yanılsama. Kopyalamadan ayrılmadan, derlenmez: [gcc] (https://godbolt.org/g/X3pTzv), [clang] (https://godbolt.org/g/AiqxxV). –

+0

Ve benim bağlantılı yazımdaki cevaplar, derleyici kopya-elifikasyonu gerçekleştirse bile, bir 'constexpr' kopyalama/taşıma yapıcısı hala erişilebilir olmalıdır (sonunda kullanılmasa bile). –

+0

@ZizhengTai Bu, kendi örneğinizin bir başka kopyasını oluşturmasının hatasıdır. https://godbolt.org/g/jT7mHd Kopya listesi-başlatma, kavramsal veya başka türlü zamansızlıklar yaratmaz. –

İlgili konular