версия с репы такая: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
опции компилятора: -std=c++11 -Wall -Wextra -Wshadow -Winit-self -Wredundant-decls -Wcast-align -Wundef -Wfloat-equal -Wunreachable-code -Wmissing-include-dirs -Wswitch-default -fno-rtti -fno-exceptions
код
#include <cstring>
#include <iostream>
class StringRef{
public:
const std::string &_ref; //const reference to some string
StringRef(const std::string &fs):_ref(fs){}
};
//print two strings
void printTwoStrings(const StringRef &ft, const std::string &fs){
std::cout<<"\nmust be: A B > ";
std::cout<< ft._ref <<" " << fs << "\n";
}
//print string ref only
void printRef(StringRef &ft){
std::cout<<"\ntrying to print string ref";
std::cout<< ft._ref << "\n";
}
int main(){
//incorrect behavior - reference to local object
StringRef lt("A");
printTwoStrings(lt,"B");
//correct behavior - reference to temporary object
printTwoStrings(StringRef("A"),"B");
//printRef(lt); //it crashes
//just wait
std::string ls;
getline(std::cin,ls);
}
печатает в неверном случае B B, а должно быть A B.
На clang-6.0 все нормально.