Здравствуйте, 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
Здравствуйте, 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.
Почему код
if constexpr (std::is_same_v<unsigned int, unsigned int>)
{
....
}
else
{
....
}
идет по ветке else?
Здравствуйте, 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);
}
Здравствуйте, 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
Здравствуйте, 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);
}
}