C++ 为什么C+中没有std::basic_string类的构造函数和std::string_视图类型的参数+;标准

C++ 为什么C+中没有std::basic_string类的构造函数和std::string_视图类型的参数+;标准,c++,string,constructor,c++17,string-view,C++,String,Constructor,C++17,String View,标准类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( " <&

标准类
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 );
}
#包括
#包括
#包括
结构A
{
空f(常量字符*s)常量
{

std::cout原因是许多
string\u视图
接受函数与同一函数的
std::string
重载不明确

std::string s({"abc", 1});
例如,这是通过调用接受构造函数从
std::string\u视图创建
std::string
,或者通过

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

最初提出了这个问题,并完成了将函数调整到模板的所有
string\u视图的调整。通过这样做,旧的字符串接口都不需要调整,以便旧的代码在C++17下编译时不会中断。

@G.M。遗憾的是,您的链接只显示了所有的构造函数。您是指模板构造吗底部的构造函数?(10和11)。它们可能接受string_视图,事实上它们接受,但前提是您理解“convertable_to”to cover“is”。实际上,string有一个来自string视图的构造函数:。它有一个简短的:“Construct string from a string_view”。所以我不认为这是重复的,但您可以编写std::string s({{“abc”,1})##include#include struct A{A(const char*,size#t){std::cout@VladfromMoscow啊,很好。也就是说,必须编写
std::string s({“abc”,1})
而不是
std::string s({“abc”,1})
使新来者更难使用该语言。如果
std::string s({“abc”,1});
不起作用,这违反了最不令人惊讶的原则。
这种黑客行为的全部目的是避免破坏现有代码。现有代码是否可以用其他方式重写并不重要。