这是一个关于using temporary stringstream object的问题的可复制示例:
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
std::string transform(std::string);
int main()
{
int i{};
cout << transform( static_cast<stringstream &>(stringstream() << i).str() );
}
在MacOS High Sierra下尝试使用 clang版本9.0.0 进行编译时,出现以下错误:
$ clang++ -std=c++11 x.cc -c
x.cc:12:24: error: non-const lvalue reference to type 'basic_stringstream<...>' cannot bind to a temporary of type 'basic_stringstream<...>'
cout << transform( static_cast<stringstream &>(stringstream() << i).str() );
^ ~~~~~~~~~~~~~~~~~~~
1 error generated.
在同一台机器上(以及在Linux上)使用g ++ 9.2.0时,一切都可以正常编译。
似乎将转换从stringstream &
更改为const stringstream &
或转换为stringstream &&
可以解决问题。
问题是这是编译器错误还是clang在某些标准规则上更严格?