2

标准类std::basic_string没有接受类型对象作为其参数的“隐式”构造函数的原因是std::string_view什么?

我希望这个程序能够编译。

#include <iostream>
#include <string>
#include <string_view>

struct A
{
    void f( const char *s ) const
    {
        std::cout << "A::f( " << s << " )\n";
    }        
};

struct B
{
    void f( const std::string &s ) const
    {
        std::cout << "B::f( " << s << " )\n";
    }        
};

template <typename... Bases>
struct C : Bases...
{
    using Bases::f...;
};

int main()
{
    C<A, B>().f( std::string_view( "Hello" ) );
    // or
    std::string_view s( "Hello" );
    C<A,B>().f( s );
}
4

1 回答 1

5

原因是因为许多接受函数与同一个函数的重载string_view是模棱两可的。std::string

std::string s({"abc", 1});

例如。这要么通过调用接受构造函数std::string从 a创建一个,要么创建一个viastd::string_viewstring_viewstd::string

basic_string(const CharT* s, size_type count, const Allocator& alloc = Allocator());

LWG 2758最初提出了这个问题,LWG 2946完成了string_view对模板的所有拍摄功能的调整。通过这样做,不需要调整旧的字符串接口,因此旧代码在 C++17 下编译时不会中断。

于 2019-08-22T12:43:08.217 回答