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)
这与此无关auto.
const引用可以延长它们所绑定的临时生命周期.但是,这仅在直接绑定临时时才有效:
int foo() { ... }
int main() {
int const &i = foo(); // Fine
}
Run Code Online (Sandbox Code Playgroud)
在你的榜样,你调用boost::optional<...>的get()函数,该函数返回一个左值参考.此引用不是临时的,因此不会延长生命周期.