0

ベクトルを返すキャスト演算子を指定すると、エラー C2664 が発生します。

void foo(const std::vector<std::wstring>& s)
{
}

class Wrapper
{
public:
    Wrapper(const std::vector<std::wstring>& s) : m_s(s)
    {
    }
    operator std::vector<std::wstring>() const
    {
        return m_s;
    }
private:
    const std::vector<std::wstring> m_s;
};

Wrapper wrapper(std::vector<std::wstring>());
foo(wrapper);
foo(static_cast<std::vector<std::wstring>>(wrapper));

私は得る:

error C2664: '`anonymous-namespace'::foo' : cannot convert parameter 1 from '`anonymous-namespace'::Wrapper (__cdecl *)(std::vector<_Ty> (__cdecl *)(void))' to 'const std::vector<_Ty> &'
with
[
  _Ty=std::wstring
]
Reason: cannot convert from 'overloaded-function' to 'const std::vector<_Ty>'
with
[
  _Ty=std::wstring
]
No constructor could take the source type, or constructor overload resolution was ambiguous

wstring を使用した同じコードは機能します。

void foo(const std::wstring& s)
{
}

class Wrapper
{
public:
    Wrapper(const std::wstring& s) : m_s(s)
    {
    }
    operator std::wstring() const
    {
        return m_s;
    }
private:
    const std::wstring m_s;
};

Wrapper wrapper(std::wstring(L"test"));
foo(wrapper);

これは Visual Studio コンパイラのバグですか、それともコンテナーはここで特別なものですか?

4

2 に答える 2