2017-07-09 4 views
3

を入力します。とリターンなどの自動車の使用とパラメータは、我々はそれを読んビャーネ・ストロヴストルップブック(C++プログラミング言語)の第4版ではC++ 14

0 
0.67 

私は異なる結果(タイプ)を得た理由は、私は疑問に思って:

#include <iostream> 

/*-----------------------------*/ 
auto multiplication(auto a, auto b) 
{ 
    return a * b; 
} 


int main() 
{ 
    auto c = multiplication(5,.134); 
    auto d = 5 * .134; 
    std::cout<<c<<"\n"<<d<<"\n"; 

} 

(14 C++ -std =を指定してコンパイル)は、このプログラムの標準出力:私はこの小さなテストプログラムを作りましたcとdの変数を返します。

EDIT: 私のGCCのバージョン:gcc version 5.4.0 20160609

+1

結果がコンパイラに分かりやすいようにするには、 'auto'を使用することをお勧めします。この場合、引数の型として 'auto'を使うと、あいまいで、解釈の対象になる可能性があります。'int' *' float'の結果は 'float'ですが、引数が間違って推測されると、そのメソッドの中で' int' * 'int'と解釈される可能性があります。 – tadman

+11

これは非標準の拡張です。 'C++ 14'は関数に対して' auto'パラメータを許可しません。 – Galik

+0

このコードでは、 "エラー:ISO C++では、型のない '乗算'の宣言が禁じられています。警告:暗黙的に 'double'から 'int'への変換により、値が0.134から0に変更されます。[-Wliteral-変換]を使用するコンパイラによって異なります。 'clang' LLVMベースのコンパイラは、何がうまくいかないかについて本当に良い説明をします。だから、このような場合には参考としてチェックする価値があります。 – tadman

答えて

6

で起動するには、あなたのコードがgcc extensionを利用し、すなわち自動機能はパラメータ。

は、私はあなたの gccのバージョンが正しく拡張子と協力し、不正な結果を提供していないと思います( GCC 7.1とI 0.67 0.67でも使用して、自動パラメータを持っています)。

template<typename T, typename U> 
auto multiplication(T a, U b) 
{ 
    return a * b; 
} 

と戻り値の型を推論するようにコンパイラを聞かせて:

標準C++であなたの関数を書き換えるための通常の方法は、テンプレートを適用することです。

+1

私はそれが正しい説明であるかどうか分かりません。 '__PRETTY_FUNCTION__'を使うと出力は' auto multiplicatio(auto:1、auto:2)[auto:1 = int; auto:2 = double] 'となります。 'T'は' int'と 'double'を同時に導くことはできません。 –

+0

@DavideSpataro 'GCC'のどのバージョンを使用しましたか? – Galik

+0

最新のものではなく、十分に新しいものでなければなりません: 'g ++(GCC)5.3.1 20160406(Red Hat 5.3.1-6)' –

3

Bjarne Stroustrupの彼の第4回目の書物"The C++ Programming Language"で始めるには、コード例でレンダリングされたautoの使用を参照しないでください。むしろauto specifierなどの標準的な使用に:そのタイプはその初期化子(例えば、auto i = 0;)によって推定されようとしている変数に対する

  • 指定子。
  • 関数の戻り値の型を指定します。関数の戻り値の型は、後続の戻り値の型またはその戻り値によって推測されます。 C++ extensions for Concepts (N4674)提案により示唆されるよう

auto foo(int a, int b) {return a + b; }

はあなたの例では、プレースホルダとして autoの使用に言及しています。残念ながら、これはまだ標準のC++ではありません。それはC++ 17で受け入れられましたが、それはできませんでした。 C++のために希望が高まる20。しかし、そのような autoの使用は、GCCによって extensionとして提供されています。 GCCのC++コンセプトに関する作業は、非常に早い時期に開始され、C++ 11の登場以前でさえも始まって​​います。ある時点で、概念に関する作業は中止され、別の名前、つまりConcepts Liteで再開されました。当時のサポートはかなり不安定でした(GCCバージョン5.4など)。したがって、あなたが経験しているのはGCCバグです。より最近のバージョンのGCCでは、このバグが修正されました。

関連する問題