如果调用函数的特定重载,如何引发编译时错误?
How to provoke a compile-time error if a specific overload of a function is called?
根据 https://en.cppreference.com/w/cpp/string/basic_string_view/basic_string_view,std::basic_string_view
class 有 7 个重载的 ctors。我只关心其中的 2 个,因为现在我不在我的代码中使用其余的。
这些是我关心的实例:
constexpr basic_string_view( const CharT* s, size_type count );
constexpr basic_string_view( const CharT* s );
我需要阻止代码调用第二个代码(因为它可能导致非空终止缓冲区的缓冲区溢出)。
我有如下内容:
#include <iostream>
#include <sstream>
#include <string>
#include <array>
void func( const std::string_view str )
{
if ( str.empty( ) )
{
return;
}
std::stringstream ss;
if ( str.back( ) == '[=11=]' )
{
ss << str.data( );
}
else
{
ss << std::string{ str };
}
}
int main()
{
std::array<char, 20> buffer { };
std::cin.getline( buffer.data( ), 20 );
const std::string_view sv { buffer.data( ), buffer.size( ) };
func( sv ); // should be allowed
func( { buffer.data( ), buffer.size( ) } ); // should be allowed
func( buffer.data( ) ); // should NOT be allowed!
}
正确的做法是什么?
根据 https://en.cppreference.com/w/cpp/string/basic_string_view/basic_string_view,std::basic_string_view
class 有 7 个重载的 ctors。我只关心其中的 2 个,因为现在我不在我的代码中使用其余的。
这些是我关心的实例:
constexpr basic_string_view( const CharT* s, size_type count );
constexpr basic_string_view( const CharT* s );
我需要阻止代码调用第二个代码(因为它可能导致非空终止缓冲区的缓冲区溢出)。
我有如下内容:
#include <iostream>
#include <sstream>
#include <string>
#include <array>
void func( const std::string_view str )
{
if ( str.empty( ) )
{
return;
}
std::stringstream ss;
if ( str.back( ) == '[=11=]' )
{
ss << str.data( );
}
else
{
ss << std::string{ str };
}
}
int main()
{
std::array<char, 20> buffer { };
std::cin.getline( buffer.data( ), 20 );
const std::string_view sv { buffer.data( ), buffer.size( ) };
func( sv ); // should be allowed
func( { buffer.data( ), buffer.size( ) } ); // should be allowed
func( buffer.data( ) ); // should NOT be allowed!
}
正确的做法是什么?