可変引数関数について読んsum
で、任意の数値型の任意の数を受け入れ、それらの合計を計算する関数を見つけました。
この関数のテンプレート化された性質により、演算子は文字列に対して定義されているためstring
、オブジェクトを受け入れると予想していました。+
#include <iostream>
#include <string>
#include <type_traits>
#include <utility>
using namespace std;
template <typename T> T sum(T && x)
{
return std::forward<T>(x);
}
template <typename T, typename ...Args>
typename std::common_type<T, Args...>::type sum(T && x, Args &&... args)
{
return std::forward<T>(x) + sum(std::forward<Args>(args)...);
}
int main()
{
auto y = sum(1, 2, 4.5); // OK
cout << y << endl;
auto x = sum("Hello!", "World"); // Makes error
cout << x << endl;
return 0;
}
エラー:
タイプ 'const char [7]' および 'const char [6]' からバイナリ 'operator+' への無効なオペランド
Hello!
私はそれが連結されてWorld
出力されることを期待してい ましたHello!World
。何が問題ですか?