2016-11-24 18 views
5

VS2015 Aktualizacja 3 kompiluje to bez błędu i bez ostrzeżenia. Mimo to miałem wrażenie, że tymczasowi mogą być związani jedynie ze stałymi odniesieniami. Czy to nie jest zgodne, czy coś nie rozumiem?Przypisanie do niestanowiącego odniesienia odniesienia

struct Foo {}; 
Foo Func6() { return Foo(); } 

TEST(Arguments, NonConstReference) 
{ 
    Foo& bob = Func6(); 
} 

EDIT

Pytanie połączone marcinj jest ten sam problem, choć kwestia ta nie jest konkretnie o VS2015 i nie znajdował się podczas Wpisałem tę jedną.

Testowałem używając/W4, aby zobaczyć, czy dostałem ostrzeżenie i nie widziałem jednego, ale testując go ponownie, stwierdzam, że teraz robię. Podczas otwierania właściwości projektu, aby dostosować ustawienie, VS2015 ma zwyczaj pokazywania okna dialogowego właściwości dla innej konfiguracji kompilacji niż aktualnie wybrana, najbardziej nieprzydatne zachowanie, które zaskoczyło mnie wiele razy (i jestem pewien, że kontynuuję aby to zrobić).

Jak wspomniano w tym drugim pytaniu, używając Disable Language Extensions (/ Za) czyni to błędem, ale niestety nie jest to rozwiązanie użyteczne, ponieważ nagłówki platformy Microsoft nie będą się wtedy kompilować.

Odpowiedz

7

Kompilator MSVC ma niestandardowe rozszerzenie, domyślnie włączone, co umożliwia tymczasowym powiązanie z odniesieniami innymi niż const. Aby to wyłączyć, użyj command-line option /Za lub odpowiedniej właściwości projektu.

+0

Nigdy nie rozumiałem, jak można tego użyć. –

+0

@GillBates jeszcze bardziej bezużyteczne, gdy masz wartości rvalue! –

+1

@GuillaumeRacicot Oczywiście, to rozszerzenie poprzedza odniesienia rvalue o co najmniej jedną dekadę, więc nie sądzę, że to uczciwe porównanie. – Angew