1. ホーム
  2. c++

auto' 型推論の使用 - コンパイラが推論した型を調べるには?

2023-07-27 09:32:12

質問

を使用したときにコンパイラが推論した型を知るにはどうしたらよいでしょうか。 auto キーワードを使用したときに、コンパイラがどのような型を推論したかを知ることができますか?

例1: よりシンプルに

auto tickTime = 0.001;

として演繹されたのでしょうか? float または double?

例2:もっと複雑(そして私の現在の頭痛の種)。

typedef std::ratio<1, 1> sec;
std::chrono::duration<double, sec > timePerTick2{0.001};
 auto nextTickTime = std::chrono::high_resolution_clock::now() + timePerTick2;

どのようなタイプかというと nextTickTime ?

私が抱えている問題は、私が送信しようとしたときに nextTickTimestd::cout . 以下のようなエラーが発生します。

./main.cpp: In function ‘int main(int, char**)’:
./main.cpp:143:16: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
  std::cout << std::setprecision(12) << nextTickTime << std::endl; // time in seconds
            ^
In file included from /usr/include/c++/4.8.2/iostream:39:0,
             from ./main.cpp:10:
/usr/include/c++/4.8.2/ostream:602:5: error:   initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<double, std::ratio<1l, 1000000000l> > >]’
 operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)

どのように解決するのですか?

私は 効果的なモダンC++の のアイデアを使いたいと思います。これは実装されていないテンプレートを使用するもので、型はコンパイラエラーで出力されます。

 template<typename T> struct TD;

では、自動変数 var を定義した後、その定義に追加します。

 TD<decltype(var)> td;

そして、コンパイラのエラーメッセージを見てください。 var .