Rozważmy poniższy kod:Czy `std :: array <T, 0>` domyślnie konstruuje gdzie `T` nie jest domyślnie konstruktywne?
#include <array>
struct T
{
T() = delete;
};
int main()
{
std::array<T, 0> a;
a.size();
}
My brak zainicjować 0-wielkości tablicy. Ponieważ nie ma elementów, nie powinien być wywoływany żaden konstruktor z T
.
Jednak nadal wymaga Clang, aby był domyślnie konstruktywny, a GCC akceptuje powyższy kod.
Zauważ, że jeśli zmienimy inicjalizacji tablicy do:
std::array<T, 0> a{};
Clang akceptuje to w ten czas.
Czy domyślnie konstruktywna T
uniemożliwia zachowanie domyślnej wartości domyślnej ?
Inicjowanie agregacji jest poprawne, nawet jeśli istnieją usunięte domyślne konstruktory. Ale inicjowanie domyślne (iirc) nie jest. Myślę, że zachowanie klangów jest rozsądne. Wykonywanie różnych czynności nie może mieć wpływu na to, czy kod jest prawidłowy podczas kompilacji. –
@ JohannesSchaub-litb Czy spodziewasz się, że element zostanie zainicjowany na macierz o rozmiarze 0? Clang robi [to] (https://wandbox.org/permlink/LashAGkeVwnfsodC), co wydaje mi się szalone. Jeśli nie ma elementów, nie należy inicjować żadnych elementów. – Jamboree
Patrz [LWG 2157] (https://timsong-cpp.github.io/lwg-issues/2157). –