1. Introduction
As found from usage experience, implicit conversions introduced by [P1391] have undesirable side effects and break existing use cases for 
2. Problems
[P1391] made 
2.1. Is vector 
   Consider the following simple example:
template < typename Container > auto ( const Container & c ) -> std :: enable_if_t <! std :: is_convertible_v < Container , std :: string_view >> { std :: cout << '[' ; const char * sep = "" ; for ( const auto & item : c ) { std :: cout << sep << item ; sep = ", " ; } std :: cout << ']' ; } void ( std :: string_view s ) { std :: cout << '"' << s << '"' ; } 
The 
What will 
Thanks to newly added implicit conversions the answer depends on the C++
standard version. In C++17 - C++20 this prints 
In C++17 - C++20 it was perfectly reasonable to assume that 
Google, LLVM, and Bloomberg have independently implemented a string-reference type to encapsulate this kind of argument.
is implicitly constructible fromstring_view andconst char * .std :: string 
The string nature of 
The new implicit conversions broke that assumption, effectively changing the
meaning of 
Conceptually the problem with these conversions is that they confuse representation with semantics using contiguity as a proxy for being a string. Consider
( std :: list { 'a' , 'b' }); ( std :: deque { 'a' , 'b' }); ( std :: vector { 'a' , 'b' }); 
| C++17 | C++20 | C++23 | |
| Output |  |  |  | 
Why is 
Of course we could change the definition of 
If this wasn’t bad enough, the same applies to non-character types as well, enabling such fun examples as:
std :: basic_string_view s = std :: vector { 42.0 }; 
or, more practically, a generic version of the 
This is not a theoretical problem. There were at least two bug reports in {fmt}, an open-source formatting library ([FMT-BUG-2585], [FMT-BUG-2634]), of subtle breakages related to this change even though it requires opting into an experimental C++23 standard library implementation which is very uncommon.
To solve the problem in {fmt} we’ll have to indefinitely continue using a
replacement for 
2.2. Type unsafety
Another problem is that 
2.3. Nonexisting practice
Maybe [P1391] standardizes existing practice? Let’s look at the types that
inspired 
- 
     LLVM’s StringRef 
- 
     Google’s StringPiece 
None of them provides a constructor from a contiguous range or even a vector. So this feature doesn’t standardize existing practice but is completely novel which explains why even a brief exposure to the implementation revealed a number of issues.
3. Alternatives
The main part of the motivation of [P1391] is compelling:
While P1206 gives a general motivation for range constructors, it’s especially important for string_view because there exist in a lot of codebases string types that would benefit from being convertible to
. For example,string_view ,llvm :: StringRef ,QByteArray ,fbstring ...boost :: container :: string 
However, the solution is overreaching and as shown above breaks the main use case for a string-like reference type by introducing semantically lossy implicit conversions.
Whether a type is string-like should generally be controlled by the class
author, not detected via some heuristic. We already have a mechanism for this
that is used in 
4. Proposal
Remove wording introduced by [P1391] from the standard.
5. Acknowledgements
Thanks Matthias Moulin and Barry Revzin for independently bringing up this issue.