l1:
return 1;
}
int main () {
int x = foo<int>();
}
такой код компилится под GCC и MSVC (С++ 20, последние версии компиляторов), под Clang нет
в то же время
#include<vector>
#include<iostream>
constexpr int foo () {
l1:
return 1;
}
int main () {
int x = foo();
}
не компилится ни под что. Кто знает в чём разница?)
Коллеги, помогите понять разницу, пожалуйста :)
ты все со своими метками. Это рабочая задача или спортивный интерес?
Второе, но это же не умаляет её?
Так надо шаблон функции инстанциировать, для этого надо указать параметр шаблона (поскольку функция без параметров и этот параметр шаблона из параметров функции не может быть выведен)
А метки там никак не влияют....
Так я же явно foo<int> вызываю Это не так делается разве?
А, сори. Там не шаблон...
Да Шаблон компилится не шаблон не компилится)
Так не компилируется, а ЧТО ? В чём проблема ?
Ну как Если код одинаковый в двух кейсах, то должно либо оба кода компилироваться, либо нет
https://godbolt.org/z/8nbqG7dTq
ну а так, я думаю версия с шаблоном в GCC MSVC отсеяла метку за ненадобностью, clang отсеивать не стал. В то же время без шаблона она ни у кого не была отсеяна
да, это вроде правда непонятно правда почему компилятор так себя ведёт :)
constexpr функция не должна иметь label в body, см https://en.cppreference.com/w/cpp/language/constexpr :
Обсуждают сегодня