std::is_same_v
От: Hоmunculus  
Дата: 25.08.25 07:47
Оценка: -1 :)
Почему код
if constexpr (std::is_same_v<unsigned int, unsigned int>)
{
....
}
else
{
....
}


идет по ветке else?
Re: std::is_same_v
От: so5team https://stiffstream.com
Дата: 25.08.25 07:59
Оценка: +1
Здравствуйте, Hоmunculus, Вы писали:

H>Почему код

H>
H>if constexpr (std::is_same_v<unsigned int, unsigned int>)
H>{
H>....
H>}
H>else
H>{
H>....
H>}
H>


H>идет по ветке else?


К таким заявлениям бы ссылку с пруфами прилагать (на godbolt/wandbox/cpp.sh/пр.)
А то что-то не верится: godbolt clang, godbolt gcc
Re[2]: std::is_same_v
От: Hоmunculus  
Дата: 25.08.25 08:01
Оценка: -2 :)
Здравствуйте, so5team, Вы писали:

я не совсем правильно выразился
Почему компилятор вообще смотрит что в ветке else?

Поставь в ветку else вот это

lkmflskdmlfs%gf


Компилятор будет ругаться. Зачем он вообще туда смотрит?

Сould not execute the program

Build failed

Compiler returned: 1
Compiler stderr

<source>:12:9: error: use of undeclared identifier 'lkmflskdmlfs'
12 | lkmflskdmlfs%gf
| ^
<source>:12:22: error: use of undeclared identifier 'gf'
12 | lkmflskdmlfs%gf
| ^
2 errors generated.

Отредактировано 25.08.2025 8:02 Hоmunculus . Предыдущая версия .
Re[2]: std::is_same_v
От: Hоmunculus  
Дата: 25.08.25 08:17
Оценка:
Здравствуйте, so5team, Вы писали:

Видимо дело не в is_same_v
Перефразрую

Пчему первая функция компилируется, а вторая — нет:

template<typename U>
void func(U a)
{
    if constexpr (std::is_same_v<unsigned int, unsigned int>)
    {
        std::cout << "true" << std::endl;
    }
    else
    {
        static_assert(false);
    }
}

void func222(int a)
{
    if constexpr (std::is_same_v<unsigned int, unsigned int>)
    {
        std::cout << "true" << std::endl;
    }
    else
    {
        static_assert(false);
    }
}
Re[3]: std::is_same_v
От: sergii.p  
Дата: 25.08.25 08:36
Оценка: 2 (1)
Здравствуйте, Hоmunculus, Вы писали:

H>Компилятор будет ругаться. Зачем он вообще туда смотрит?


The discarded statement cannot be ill-formed for every possible specialization:


https://en.cppreference.com/w/cpp/language/if.html
но например шаблоны не будут инстанциироваться, так что такая чушь скомпилируется

template<typename T>
struct Foo{

};

template<typename T>
void foo(T&& t){
    if constexpr (std::is_same_v<T, unsigned int>) {
        std::cout << "true" << std::endl;
    } else {
        Foo<T>::мяу();
    }
}

int main(){
    foo(1u);
}
Re[3]: std::is_same_v
От: so5team https://stiffstream.com
Дата: 25.08.25 11:29
Оценка: 14 (3)
Здравствуйте, Hоmunculus, Вы писали:

H>Пчему первая функция компилируется, а вторая — нет:


Потому что так прописано в стандарте:

In a static_assert-declaration, the constant-expression E is contextually converted to bool and the converted expression shall be a constant expression ([expr.const]). If the value of the expression E when so converted is true or the expression is evaluated in the context of a template definition, the declaration has no effect and the static_assert-message is an unevaluated operand ([expr.context]). Otherwise, the static_assert-declaration fails and...


Т.е. условное выражение в static_assert всегда вычисляется, если только static_assert не задействован в определении шаблона.
Насколько я понимаю, в случае шаблона static_assert вычисляется уже в момент инстанциирования шаблона.

Почему в стандарте записали именно так --

PS. Если правильно понимаю, для стандартов до C++20 включительно писать static_assert(false) формально нельзя:
https://cplusplus.github.io/CWG/issues/2518.html
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2593r1.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.