これは、コードベースで私が抱えている特定の問題というよりも、むしろ意見を求めるものです。次の簡単な例を見てみましょう:-
class Ref
{
public:
Ref(char* s, size_t l) : _s(s), _l(l) {}
private:
char* _s;
size_t _l;
};
std::stringstream ss;
char a[256];
ss >> Ref(a, sizeof(a)); // <-------- here is the discussion line
friend std::stringstream& operator>>(std::stringstream& ss, Ref& r)
{
// perform some functionality
}
Visual Studioを使用すると、上記は正常にコンパイルされます...演算子>>を使用すると、参照を受け取るオーバーライドがあるため、作成されたオブジェクトを参照として渡すことを意味することがわかります。ただし、gcc を使用するとぐらつきます。操作に演算子のオーバーロードがないことを訴えています。
技術的には、オブジェクトを作成し、オブジェクトへの参照ではなく、基本的にオブジェクトをオペレーターに渡すため、gcc は正しいと思います。Microsoftコンパイラがこれを許可する理由、またはgccが参照渡しを意図していることを理解できないのはなぜだろうか? 上記の場合、Ref オブジェクトはかなり自明であり、参照渡しまたはオブジェクト自体はほとんど問題になりませんが、Ref がより複雑で重いものである場合、おそらく問題になる可能性があります。
それで、私は人々に上記についてどう思うか尋ねています...そしていくつかの提案をします. 明らかに、Ref を構築して参照渡しするか、参照ではなくオブジェクトを取るように演算子のオーバーロードを変更することもできますが、実際には、Visual Studio と gcc のこの違いとあなたの意見についての詳細です。