6

Visual Studio 2012 を使用して新しい std::thread を使用する方法を理解しようとしています。次のコードをコンパイルしようとしています。

#include <iostream>
#include <thread>

class scoped_thread
{
    std::thread t_;

public:

    explicit scoped_thread(std::thread & t): t_(std::move(t))
    {
        if(!t_.joinable())throw std::logic_error("No thread");
    }

    ~scoped_thread()
    {
        t_.join();
    }

private:

    scoped_thread(scoped_thread const &);
    scoped_thread & operator=(scoped_thread const &);
};

struct local_functor
{
    int& i_;

    local_functor(int & i):i_(i){}

    void operator()()
    {
        while(i_ < 1e5)i_++;        
    }
};

// can potentially throw exceptions
void callAnotherFunc()
{
    std::cout << "this function can throw an exception" << std::endl;   
    // try (un)commenting the line below and see the behaviour
    throw std::out_of_range("WTF2");
}


int main()
{
    int some_local_state =  0;

    try
    {   
        scoped_thread t(std::thread(local_functor(some_local_state)));
        callAnotherFunc();

        std::cout << "Proper exit of function" << std::endl;
    }
    catch(const std::exception & e)
    {
        std::cout << e.what() << " exception occurred!" << std::endl;
    }
    catch(...)
    {
        std::cout << "Unhandled exception!" << std::endl;
    }

    return 0;
}

警告 C4930 という警告が表示されます: 'scoped_thread t(std::thread (__cdecl *)(local_functor))': プロトタイプ化された関数が呼び出されませんでした (意図した変数定義でしたか?)

はい、意図した変数定義でした。どうすればいいですか?

4

2 に答える 2

7

この警告は、try ブロックの最初の行が関数宣言として解析されることを示しています。C++03 の初期化スタイルを使用すると、このようなことが時々起こります。代わりに均一な初期化を使用します。

scoped_thread t{std::thread{local_functor{some_local_state}}};

さらに&、scoped_thread コンストラクターに欠落があります。

explicit scoped_thread(std::thread && t): t_(std::move(t))
//                                 ^-- use r-value ref

PS: コンパイラが均一な初期化をサポートしていない場合は、イニシャライザを別の括弧のペアでラップします。scoped_thread t((std::thread(local_functor(some_local_state))));

于 2013-01-10T08:44:31.203 に答える
6

あなたは最も厄介な解析に出くわしました

統一された初期化構文を使用して解決できます。

scoped_thread t{std::thread(local_functor(some_local_state))};
于 2013-01-10T08:39:46.430 に答える