29105

[code]

    #include <iostream>
    #include <complex>
    using namespace std;
    
    int main() {
    complex<int> p;
    int m;
    
    cin >> p.real() >> p.imag();
    cout << p.real() << p.imag();
    
    return 0;
    
    }
    
[/code]

このコードはg++(gcc version 4.8.4)では問題なく実行できますが、Visual Studio Community
2015上ではエラー(C2678)となりますが、なぜこのような違いが生じるのでしょうか。

> エラー C2678 二項演算子 '>>': 型 'std::istream' の左オペランドを扱う演算子が見つかりません (または変換できません)
> (新しい動作; ヘルプを参照)。


CC BY-SA 3.0
2016-09-25T01:04:08.980
29102
2016-09-25T03:40:17.163
2016-09-25T03:40:17.163
754
8319
question
c++ visual-studio gcc
cinを用いて複素数に数字を入力するコードが、 Visual Studio だとエラーになる


[`std::complex::real()`](http://cpprefjp.github.io/reference/complex/complex/real.html)
は

[code]

    T real() const;                 // (1) C++11 まで
    constexpr T real() const;       // (1) C++14 から
    
[/code]

とC++14から仕様変更されています。Visual Studio 2015ではC++14に準拠しconstexpr関数になっているため`operator
>>()`で書き込むことはできません。

そもそもC++11以前でもconst関数なので書き込む行為そのものが間違っています。G++では問題なく実行できたとのことですが、（コンパイラー依存ではなく）ライブラリの実装依存です。


CC BY-SA 3.0
2016-09-25T01:18:33.530
29104
2016-09-25T01:18:33.530
4236
29102
answer


VC++2015でコンパイルエラーになるのは、`real()`/`imag()`がC++14からconstexpr関数に変わり、戻り値である定数`constexpr
T`に書き込めないからです。

[code]

    // C++14
    constexpr T real() const;
    constexpr T imag() const;
    
[/code]

GCC 4.8.4でコンパイルエラーにならないのは、まだC++14に対応していないバージョンだからですが、標準では戻り値は **参照ではない**
変数`T`なので、書き込んでも意味がありません。

[code]

    // C++03
    T real() const;
    T imag() const;
    
[/code]

GCC
4.8.4というかlibstdc++が参照を返すようになっていたので[期待した動作をしていた](http://melpon.org/wandbox/permlink/iKshxofEq5NwXxBx)かもしれませんが、[標準では期待した動作になりません](http://melpon.org/wandbox/permlink/KHrKrWtLqnKKBxlH)。

[code]

    // GCC 4.8.x
    T &real();
    const T &real() const;
    T &imag();
    const T &imag() const;
    
[/code]


CC BY-SA 3.0
2016-09-25T03:27:24.013
29105
2016-09-25T03:27:24.013
7291
29102
answer