我发现了最令人讨厌的绑定问题,似乎是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)
答案 0 :(得分:6)
这与auto
无关。
const
引用可以延长它们绑定的临时值的生命周期。但是,这仅在直接绑定临时
int foo() { ... }
int main() {
int const &i = foo(); // Fine
}
在您的示例中,您调用boost::optional<...>
的{{1}}函数,该函数返回左值引用。这个引用不是暂时的,因此不会延长寿命。