C++ 将引用分配给新创建的堆栈分配对象时会发生什么情况?

C++ 将引用分配给新创建的堆栈分配对象时会发生什么情况?,c++,memory-management,reference,stack,C++,Memory Management,Reference,Stack,在此代码中: SomeClass& some_object = SomeClass(); 某个对象指的是什么?它有效吗?或者根本没有定义的行为?它是无效的,因为在中不应编译: 右值不能绑定到非常量左值引用 但是,某些编译器(例如MSVC)允许将右值绑定到非常量左值引用作为编译器扩展。它无效,因为在中不应编译: 右值不能绑定到非常量左值引用 但是,某些编译器(例如MSVC)允许将右值绑定到非常量左值引用作为编译器扩展。它无效,因为在中不应编译: 右值不能绑定到非常量左值引用 但是,某些编

在此代码中:

SomeClass& some_object = SomeClass();

某个对象指的是什么?它有效吗?或者根本没有定义的行为?

它是无效的,因为在中不应编译:

右值不能绑定到非常量左值引用


但是,某些编译器(例如MSVC)允许将右值绑定到非
常量
左值引用作为编译器扩展。

它无效,因为在中不应编译:

右值不能绑定到非常量左值引用


但是,某些编译器(例如MSVC)允许将右值绑定到非
常量
左值引用作为编译器扩展。

它无效,因为在中不应编译:

右值不能绑定到非常量左值引用


但是,某些编译器(例如MSVC)允许将右值绑定到非
常量
左值引用作为编译器扩展。

它无效,因为在中不应编译:

右值不能绑定到非常量左值引用


但是,某些编译器(例如MSVC)允许将右值绑定到非常量左值引用作为编译器扩展。

它根本不编译

不允许将非常量引用(
T&
)绑定到临时变量。您可以将临时变量绑定到
const T&
或自C++11以来,
T&
,不过:

const SomeClass& obj = SomeClass();
SomeClass&& obj = SomeClass();

它根本不编译

不允许将非常量引用(
T&
)绑定到临时变量。您可以将临时变量绑定到
const T&
或自C++11以来,
T&
,不过:

const SomeClass& obj = SomeClass();
SomeClass&& obj = SomeClass();

它根本不编译

不允许将非常量引用(
T&
)绑定到临时变量。您可以将临时变量绑定到
const T&
或自C++11以来,
T&
,不过:

const SomeClass& obj = SomeClass();
SomeClass&& obj = SomeClass();

它根本不编译

不允许将非常量引用(
T&
)绑定到临时变量。您可以将临时变量绑定到
const T&
或自C++11以来,
T&
,不过:

const SomeClass& obj = SomeClass();
SomeClass&& obj = SomeClass();

根据标准,这是无效的。但是,一些编译器(特别是MSVC)将允许它作为扩展

您可以将临时变量分配给对const的引用,这将导致该临时变量的生存期延长到引用的生存期:

{
    const SomeClass& some_object = SomeClass();
    // more code, some_object is valid
} //some_object is destructed here

根据标准,这是无效的。但是,一些编译器(特别是MSVC)将允许它作为扩展

您可以将临时变量分配给对const的引用,这将导致该临时变量的生存期延长到引用的生存期:

{
    const SomeClass& some_object = SomeClass();
    // more code, some_object is valid
} //some_object is destructed here

根据标准,这是无效的。但是,一些编译器(特别是MSVC)将允许它作为扩展

您可以将临时变量分配给对const的引用,这将导致该临时变量的生存期延长到引用的生存期:

{
    const SomeClass& some_object = SomeClass();
    // more code, some_object is valid
} //some_object is destructed here

根据标准,这是无效的。但是,一些编译器(特别是MSVC)将允许它作为扩展

您可以将临时变量分配给对const的引用,这将导致该临时变量的生存期延长到引用的生存期:

{
    const SomeClass& some_object = SomeClass();
    // more code, some_object is valid
} //some_object is destructed here

你试过编译它吗?可能的重复你试过编译它吗?可能的重复你试过编译它吗?可能的重复你试过编译它吗?可能的重复