2017-02-24 3 views
3

は考えてみましょう:std :: is_arithmeticは、int型の汎用ラムダ内でfalseを返します。未定義の動作ですか?

#include <iostream> 
#include <typeinfo> 
#include <type_traits> 

#include <cxxabi.h> 

#include <boost/hana.hpp> 
namespace hana = boost::hana; 

struct Person { 
    BOOST_HANA_DEFINE_STRUCT(Person, 
    (std::string, name), 
    (int, age) 
); 
}; 

template<typename T> 
void stringify(const T& v) { 
    hana::for_each(hana::accessors<T>(), [&v](auto a) { 
     // Here I'm printing the demangled type, just to make sure it is actually the type I'm thinking it is. 
     std::cout << abi::__cxa_demangle(typeid(decltype(hana::second(a)(v)){}).name(), 0, 0, 0); 

     // If the value is arithmetic, "quote" should be an empty string. Else, it should be an actual quote. 
     // UNEXPECTED BEHAVIOR IS HERE 
     std::string quote{(std::is_arithmetic<decltype(hana::second(a)(v))>::value?"":"\"")}; 

     // Finally do what we're here for. 
     std::cout << " " << hana::first(a).c_str() << " = " << quote << hana::second(a)(v) << quote << "\n"; 
    }); 
} 

int main() { 
    Person john; 
    john.name = "John Doe"; 
    john.age = 42; 
    stringify(john); 
} 

See it live

出力:私は私ではなく、いくつかの他の非算術型の数を扱っていた場合に伝えるためにstd::is_arithmeticを使用しようとしている

std::__cxx11::basic_string</*...*/> name = "John Doe" 
int age = "42" 

それに応じて引用符を印刷する(または印刷しない)。

しかし、いくつかの理由で、(::value部材を介して)「返さ」という値は、私はint(私は私が最初にGCCのcxxabi.hを使用してデマングルタイプを印刷することにより、その権利をやっていることを確認してくださいを渡しているにもかかわらず、falseです)

出力からわかるように、intは引用符で印刷されます。

私の質問は、なぜ偽を返すのですか?これは一般的なラムダと関係がありますか?私はそれを修正することはできますか?

私は実際にこれを直接Coliruでテストしていますので、そこに使用されているgccのバージョン(現在6.3.0)を想定できます。

+0

http://coliru.stacked-crooked.com/a/6d50720bf7bf64aa – llonesmiz

+0

@llonesmiz oohhh。私はどこかで私が愚かでなければならないことを知っていた。私はそれを受け入れることができるようにこれを回答として投稿できますか? –

+0

"デングレインタイプを印刷する"という簡単な代替方法の1つは、無効な初期化を伴う変数宣言を追加して、診断の一部としてタイプ記述を生成することです。 :) –

答えて

関連する問題