Как предотвратить неявное преобразование аргументов функции C++ при использовании концепций?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как предотвратить неявное преобразование аргументов функции C++ при использовании концепций?

Сообщение Anonymous »

Я пытаюсь использовать концепции C++20 для реализации интерфейса для нескольких классов (и я не хочу использовать чисто виртуальные функции). Проблема, с которой я столкнулся, похоже, заключается в том, что неявные преобразования допускают вещи, которые на самом деле должны ломаться.
Я знаю о явных преобразованиях, но их можно использовать только с векторами и функциями преобразования.Позвольте мне показать код, иллюстрирующий проблему:

Код: Выделить всё

#include 
#include 

// =============================

// Define the interface
template
concept ImplementsInterface = requires(T obj, int x)
{
{ obj.func(x) } -> std::same_as;
};

// =============================

// Here is one implementation of the interface
struct B
{
double func(int x) // Note the INCORRECT 'double' return type
{
return x + 5;
}
};

// This DOES produce a compiler error (yay!)
static_assert(ImplementsInterface);

// =============================

// Here is another implementation of the interface
struct C
{
int func(char x) // Note the INCORRECT 'char' argument
{
return x + 6;
}
};

// This DOES NOT produce a compiler error (and I want it to!)
static_assert(ImplementsInterface);
(Godbolt: https://godbolt.org/z/4sbPhdGhK)
Я думаю, C::func(char) использует неявное преобразование из char-> и поэтому компилятор не помечает это. Как я могу это предотвратить? Мне нужна ошибка в static_assert из-за неправильного типа аргумента в C::func().
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/784 ... -using-con
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»