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 回答