std :: thread Visual Studio 2012警告

时间:2013-01-10 08:37:15

标签: c++ visual-c++ c++11 visual-studio-2012 stdthread

我试图了解如何使用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))':未调用prototyped函数(是否为变量定义?)

是的,这是一个有意的变量定义。我该怎么做?

2 个答案:

答案 0 :(得分: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))));

答案 1 :(得分:6)

你偶然发现the most vexing parse

您可以使用uniform initialization语法解决此问题:

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