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

joh*_*co3 0 c++ gcc c++11 c++14

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

如果我将自动变量绑定到'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;  
Run Code Online (Sandbox Code Playgroud)

产生了以下输出

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

Que*_*tin 6

这与此无关auto.

const引用可以延长它们所绑定的临时生命周期.但是,这仅在直接绑定临时时才有效:

int foo() { ... }

int main() {
    int const &i = foo(); // Fine
}
Run Code Online (Sandbox Code Playgroud)

在你的榜样,你调用boost::optional<...>get()函数,该函数返回一个左值参考.此引用不是临时的,因此不会延长生命周期.