2015-12-21 15 views
15

birinci pasajı herhangi bir uyarı olmaksızın (live example) derler:Bu snippet'ler neden GCC'ye göre farklı şekilde işleniyor?

constexpr operator int() { return i; } 

GCC b bir VLA olduğunu uyarır:

#include <iostream> 

struct A { 
    constexpr A(): i(5){} 
    constexpr operator int() { return 5; } 
    int i; 
}; 

int main() { 
    A a; 
    int b[a]{ 0, 1, 2, 3, 4 }; 
    std::cout << b[4] << '\n'; 
} 

, dönüşüm operatörü (live example) içerisinde i döndürerek yukarıdaki parçacık değiştirebilir .

Bana göre

, her iki varyant C++ 14'de paragrafta §5.19 [expr.const]/3'e uygun görünmektedir.

cevap

17

Sen i bir ltr dönüşüm yapıyoruz, ama için [expr.const]/(2.7), burada (2.7.3) ihlal edilmesi değil uygulanabilir olması gerekir:

enter image description here

a s beyanı b önce gelir 'beri uygulanamaz - (2.7.1) endişeler tam nesneler, (2.7.2) dize hazır bahsediyor ve (2.7.4) hayat boyu ifadesinin değerlendirilmesi içinde başlayan nesneler ile ilgili.

a'u constexpr olarak tanımlayın ve kod uyumludur. parantez içindeki ifade dönüştürülür

bir olarak [expr.const]/4 tanımlanan tipte std::size_t dönüştürülmüş bir sabit ifadesi ([dcl.array]/1) olması gerekir:


Küçük bir ek Ne standart der netleştirmek için tipT sabit ekspresyon örtülü olarak dönüştürülür sentezleme sabit bir ifadesidir T, tip dönüştürülmüş bir ekspresyon, ve [... karşılanmaktadır şartları ...]

Böylece gerçekten, standart geçerli olacaktır

constexpr std::size_t s = a; 

olsun veya olmasın ilgileniyor. Önceden belirtilen nedenlerden dolayı, daha önce tanımlanmış, constexpr nesnesinin bir alt nesnesini kullanmaya çalışmaktadır.

+0

Bu durumda neden bir “aval değerden dönüştürme” yapılmalı? Bunu soruyorum çünkü §1.19/3 (N4140) 'da “dönüştürülmüş bir sabit ifade” nin tanımı, “a” ifadesinden “a” dan b'ye [a] {0, 1) ihtiyaç duymuyor gibi görünmektedir. , 2, 3, 4}; '. – Ayrosa

+0

@Ayrosa Eh, 'asla bir tane geçmek zorunda kalmaz, ancak 'std :: size_t' değerine dönüştürmek için dönüşüm operatörünün çağrılması gerekir. Gerçekten dediğin ve Cevabınız vurgulanan neyi kavramak biraz zaman aldı – Columbo

+1

('a' parantez içindeki tipi' std :: size_t' bir dönüştürülen sabit ifadesidir).Kesinlikle, standardı tam olarak anlamak, bir tanesi için kolay bir iş değildir. Harika cevap (+1). – Ayrosa

4

Diziler boyutu derleme zamanı sabitleri olmalıdır, ancak ikinci örnekte A::i başlatması çalışma zamanı'a kadar gerçekleşmez.

+0

A :: A() ', 'constexpr' olsa ... – YSC

+0

@YSC Evet, ancak 'a' değişkeni 'ana' işlevinde değil. –

+1

Ve * bu * gerçek uyarı kaynağı değil mi? – YSC

İlgili konular