无法从int初始化unordered_map

时间:2011-07-21 00:07:12

标签: visual-studio-2010 c++11

我有一个非常奇怪的问题。 MSVC没有初始化列表,所以我使用了lambda来近似它们。

static const std::unordered_map<std::wstring, LexedFile::Token> reserved_words = 
    []() -> std::unordered_map<std::wstring, LexedFile::Token> {
    std::unordered_map<std::wstring, LexedFile::Token> retval;
    // Do stuff with retval
    return retval;
}();

MSVC抛出编译错误。

error C2440: 'initializing' : cannot convert from 'int' to 
'std::tr1::unordered_map<_Kty,_Ty>'

除非我非常盲目,否则在此附近没有“int”。我没有看到什么是错的。有什么建议吗?

编辑:

// Do stuff with retval没什么好玩的,它只是一堆插入,这是成员函数中lambda中的函数范围静态变量。

auto next = [&] {
    static const std::unordered_map<std::wstring, LexedFile::Token> reserved_words = 
    []() -> std::unordered_map<std::wstring, LexedFile::Token> {
        std::unordered_map<std::wstring, LexedFile::Token> retval;
        retval[L"namespace"] = LexedFile::Token::Namespace;
        retval[L"for"] = LexedFile::Token::For;
        retval[L"while"] = LexedFile::Token::While;
        retval[L"do"] = LexedFile::Token::Do;
        retval[L"switch"] = LexedFile::Token::Switch;
        retval[L"case"] = LexedFile::Token::Case;
        retval[L"default"] = LexedFile::Token::Default;
        retval[L"try"] = LexedFile::Token::Try;
        retval[L"catch"] = LexedFile::Token::Catch;
        retval[L"auto"] = LexedFile::Token::Auto;
        retval[L"type"] = LexedFile::Token::Type;
        retval[L"break"] = LexedFile::Token::Break;
        retval[L"continue"] = LexedFile::Token::Continue;
        retval[L"return"] = LexedFile::Token::Return;
        retval[L"static"] = LexedFile::Token::Static;
        retval[L"sizeof"] = LexedFile::Token::Sizeof;
        retval[L"decltype"] = LexedFile::Token::Decltype;
        retval[L"if"] = LexedFile::Token::If;
        retval[L"else"] = LexedFile::Token::Else;
        return retval;
    }();
    if (stack.empty())
        return;
    std::wstring token(stack.begin(), stack.end());
    stack.clear();
    if (reserved_words.find(token) != reserved_words.end()) {
        l.tokens.push_back(reserved_words.find(token)->second);
        return;
    }
    l.tokens.push_back(LexedFile::Identifier);
};

如果我直接使用构造函数而不是初始化,编译器会接受它,这看起来很奇怪。可能是编译器错误。

1 个答案:

答案 0 :(得分:0)

使用()而不是使用=调用构造函数可以正常工作,所以我将此标记为编译器错误。