LINUX.ORG.RU

Non-narrowing cast in C++

 ,


0

2

Есть non-narrowing инициализация: long l = 0; int i {l}; = ошибка. Хочу такой же typecast.

Вот так работает:

long l = 0;
void f(int) {}
f((int){l});  // ошибка
f({l});  // тоже ошибка

…но компилятор выплёвывает warning: -Wpedantic: "ISO C++ forbids compound-literals". Гы, неужели я слишком многого хочу? :)

Сделал в итоге вот такую дичь:

template<class R, class P> R safeCast(P x) {
	R y {x};
	return y;
}
f(safeCast<int>(l));   // ошибка

Не ругается, но дюже громозко (жду каментов «это ж плюсы, пора бы и привыкнуть»).

Есть ещё варианты?

★★★★★

…но компилятор выплёвывает warning: -Wpedantic: "ISO C++ forbids compound-literals".

Так и не надо их использовать:

f(int{l});  // ошибка
xaizek ★★★★★
()

а чем не устраивает «все ворнинги - ошибки» режим?

abcq ★★
()

Это наброс такой? Свои примеры компилил? Сижу думаю - неужели нельзя сделать проверку на narrow conversion без костылей в такой элементарщине, проверяю пример:

$ cat 1.cc 
void f(int) {}
int main() {
	long l = 0;
	f( {l} );  // тоже ошибка
}

$ g++ 1.cc -Wpedantic
1.cc: In function ‘int main()’:
1.cc:4:13: warning: narrowing conversion of ‘l’ from ‘long int’ to ‘int’ [-Wnarrowing]
    4 |         f( {l} );  // тоже ошибка
      |             ^

Где тебе тут про compound-literals померищлось?

Хотя лично сам всю эту narrow check лабуду полезной не нахожу, хорошо что вкуртили недавно возможность инициализировать агрегаты через круглые скобки без всех этих дурацких проверок.

kvpfs ★★
()
Ответ на: комментарий от xaizek

А вот f(const char*{x}) не скомпиляется, поэтому и стал брать тип в скобки.

dimgel ★★★★★
() автор топика
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от anonymous

Пока что выходит проще всего как @xaizek написал, а многословные типы проще всего заалиасить: using ccp = const char*; ccp{x}. И вообще вопрос дурацкий.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Clang, да, ругается.

Во, наверное в этом фокус. Я в IDE смотрю – ошибка. А компилять и не пробовал.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Ну, вот опять шахтер, которому дали казенную кирку, виноват.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.