2015-06-11 45 views
0

我編寫一個簡單的(也可能是錯誤的)C++文件:libstdC++中允許的函數類型不兼容?

// file test_function.cpp 
#include <functional> 

void foo() 
{ 
    void* (*func)() = nullptr; 
    std::function<void()> func_(func); 
} 

我覺得func_的類型應該是std::function<void*()>。正如預期的那樣,鐺++用的libC++提供了一個錯誤:

$ clang++ -std=c++14 -c -stdlib=libc++ test_function.cpp 
test_function.cpp:6:27: error: no matching constructor for initialization of 'std::function<void()>' 
    std::function<void()> func_(func); 
         ^ ~~~~ 

然而,g ++以及鐺++與++的libstdc沒有給出錯誤:

$ clang++ -std=c++14 -c -stdlib=libstdc++ test_function.cpp 
$ g++ -std=c++14 -c test_function.cpp 

是這種情況正常嗎? C++標準中是否有關於函數類型轉換的描述?

回答

1

我不知道你爲什麼認爲func的類型應該是std::function<void*()>。畢竟,您定義func_,否則爲std::function<void()>func_的定義決定了它的類型。

您得到的錯誤與您是否可以忽略func返回類型(原始函數指針(您的名稱選擇相當混亂TBH))的問題有關。這應該是可能的。

+0

從http://stackoverflow.com/a/9343400/3786245開始,_proper_和_safe_用法應該是'std :: function '。我對麼? –

+1

如果您需要返回值,這是正確的用法。如果你不這樣做,void()很好。 – KABoissonneault

+0

謝謝@KABoissonneault我看到了理由。 –