gcc 4.9.1将c ++局部变量绑定到const auto ref

时间:2016-04-12 14:44:40

标签: c++ c++11 gcc c++14

我发现了最令人讨厌的绑定问题,似乎是GCC特有的。我不确定这是不是我不理解const auto&绑定的规则,或者问题是否指向gcc编译器特定的bug。相比之下,Visual Studio 2015的C ++编译器(撰写本文时的更新2)并未表现出这种不可预测的行为。我能够用简约live coliru demo来重现问题。

如果我将自动变量绑定到'const auto&',则会出现问题。在这种情况下,似乎const auto&绑定变量绑定到垃圾。如果这是用户错误(我不理解规则),有人可以解释有关我应该如何做到避免这种意外行为的规则。现场演示展示了我遇到错误的一个例子,我不确定这个问题是否可能在其他地方发生,因为我倾向于尽可能使用const auto&绑定。

OptPairWrapper wrapper;
wrapper.setOptPair(std::make_pair(1,2));
const auto& badConstAutoRefBind = wrapper.getOptPair().get();
const auto goodConstAutoBind = wrapper.getOptPair().get();
// This line prints garbage
std::cout << badConstAutoRefBind << std::endl;  
// This line predictably prints (1,2)
std::cout << goodConstAutoBind << std::endl;  

产生了以下输出

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp -lrt && ./a.out
(32767, 0)
(1, 2)

1 个答案:

答案 0 :(得分:6)

这与auto无关。

const引用可以延长它们绑定的临时值的生命周期。但是,这仅在直接绑定临时

时有效
int foo() { ... }

int main() {
    int const &i = foo(); // Fine
}

在您的示例中,您调用boost::optional<...>的{​​{1}}函数,该函数返回左值引用。这个引用不是暂时的,因此不会延长寿命。