私はC++11の機能に比較的慣れていません。自動機能と、それがどのようにファンクターをタイプ推論するかについて質問があります。次のコードスニペットについて考えてみます。
bool test1(double a, double b) {
return (a<b);
}
bool test2(double a, double b) {
return (a>b);
}
struct Test1 {
bool operator()(double a, double b) {
return (a<b);
}
};
struct Test2 {
bool operator()(double a, double b){
return (a>b);
}
};
int main() {
const bool ascending = false;
auto comparator = ascending? test1:test2; // works fine
auto comparator2 = ascending? Test1():Test2(); // compiler error: imcompatible types
std::function<bool(double, double)> comparator3 = ascending? Test1():Test2(); // compiler error: imcompatible types;
}
auto(およびstd :: function)は関数に対しては正常に機能しますが、関数オブジェクトに対しては失敗します(型推定)。どうしてこれなの?ここでタイプ控除の基本的なものが欠けています。
(私はVisual Studio 2012を使用しています)