Operatörün yeni icra sırası ve yapıcı argümanı


9

Mu C ++ sırasını belirlemek spec operator newve yapıcı Aiçinde new C(A()).
G ++ sıra A()- - new-> olsun C(), ama clang ++ new- A()- -> olsun C().
Aradaki fark belirtilmemiş davranışlardan mı kaynaklanıyor?

g ++: 7.4.0 clang ++: 10.0.0

#include <iostream>
#include <cstdlib>

struct A {
    A() {
        std::cout << "call A()\n";
    }
};

struct C {
    C(A) {
        std::cout << "call S()\n";
    }

    void *operator new(size_t s) {
        std::cout << "call new()\n";
        return malloc(s);
    }
};

int main() {
    void *p = new C(A());
}

3
C ++ 17, C ++ 14 veya öncesi olarak mı inşa ediyorsunuz?
StoryTeller - Unlander Monica

4
İki not: Bunu, etiketin açıklamasını okumadığınızı açıkça gösteren "C" ile etiketlediniz. Yapma. Şimdi, "tanımsız davranış" (UB) hakkında soruyorsunuz. Bu, C ++ standardı tarafından her şeyin olabileceği ve kaçınılması gereken şeyleri işaretlemek için kullanılan bir terimdir. Kod teknik olarak iyi olduğundan ve UB'ye neden olmadığından, muhtemelen peşinde olduğunuza daha yakın olan "belirtilmemiş davranış" da vardır.
Ulrich Eckhardt

1
@Ulrich Eckhardt Öneriniz. İkisini karıştırdım.
eddie kuo

Yanıtlar:


11

Clang doğru. C ++ 17'den beri yürütme sırası garanti edilir. [expr.new] / 19

Tahsis fonksiyonunun çağrılması, yeni başlatıcıdaki ifadelerin değerlendirilmesinden önce sıralanır .

operator new(ayırma işlevi) önce çağrılmalı, daha sonra yeni başlatıcıdaki (yani A()) ifadenin değerlendirilmesi .

C ++ 17'den önce sipariş garanti edilmez. [expr.new] / 18 (C ++ 14)

Tahsis fonksiyonunun çağrılması, yeni başlatıcıdaki ifadelerin değerlendirilmesine göre belirsiz bir şekilde sıralanır .


Görünüşe göre gcc C ++ 17 (ve üstü) ile uyumlu değil; C ++ 2a modunda gcc10 ile derlemek aynı sonucu verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.