Этот код нормально компилируется в gcc, но не работает в Visual C++.
MCVE = https://wandbox.org/permlink/SqNI85EospSrwm5T
int main() {
auto func_do1Pass2=[&]() {
return 8;
};
constexpr int g=func_do1Pass2();
auto sLambda=[&]() {
constexpr int g2=func_do1Pass2(); //<== error at Visual C++
};
}
Выражение ошибки C2131 не получило константу
Кто не прав? Почему? Пожалуйста, дайте ссылку.
Вот мой более реальный пример. Каков обходной путь для приведенного ниже кода в случае Visual C++?
Код:
void testtt() {
auto func_do1Pass2=[&]<int s>() {
return 8;
};
[&]<int s2>() {
///vvv can edit only here
constexpr int g2=func_do1Pass2.operator()<s2>();
///^^^ can edit only here
}.operator()<2>();
}
func_do1Pass2
не constexpr (пока)
@cppBeginner Я отменил ваше редактирование, потому что вам не следует редактировать вопрос, чтобы сделать выходные ответы недействительными. Вместо этого вам следует опубликовать новый вопрос.
@wohlstad :: Согласен. Я подчинюсь.
Да, нет никаких ограничений на задавание новых вопросов, если они достаточно разные. Как и в вашем новом вопросе, вы можете явно сказать и подчеркнуть, что вы используете локальные переменные func_do1Pass2
, чтобы новый ответ не стал недействительным.
Просто создайте func_do1Pass2
constexpr, как показано ниже. Проблема в том, что в вашем коде func_do1Pass2
нет constexpr, поэтому его нельзя использовать в контексте constexpr.
void testtt() {
//--vvvvvvvvv-------------------------------->added constexpr here
constexpr auto func_do1Pass2=[&]<int s>() {
return 8;
};
[&]<int s2>() {
constexpr int g2=func_do1Pass2.operator()<s2>();
}.operator()<2>();
}
Это полезно. Извините, я не упомянул, что func_do1Pass2
может изменять локальную переменную в некоторых s
случаях. Таким образом, сделать лямбду constexpr
невозможно. Это моя вина. Я отредактировал свой вопрос. Спасибо. +1
Можем ли мы просто удалить constexpr для строки constexpr int g2=func_do1Pass2.operator()<s2>();
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int localVariable=0; //some local variable
auto func_do1Pass2=[&]<int s>() {
if constexpr(s==5){localVariable=7;}
///^ may modify some local variables
return 8;
};
[&]<int s2>() {
///vvv can edit only here
int g2=func_do1Pass2.operator()<s2>();
///^^^ can edit only here
}.operator()<2>();
}
рабочая демо: https://godbolt.org/z/rqPEr4qee
И, если вы удалите параметр компиляции /permissive-
, следующий код сможет успешно скомпилироваться.
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
int localVariable=0; //some local variable
auto func_do1Pass2=[&]<int s>() {
if constexpr(s==5){localVariable=7;}
///^ may modify some local variables
return 8;
};
[&]<int s2>() {
///vvv can edit only here
const int g2=func_do1Pass2.operator()<s2>();
///^^^ can edit only here
}.operator()<2>();
}
Рабочая демо: https://godbolt.org/z/5jTq835x5
Я не могу, извини.
После того, как вы отредактировали, извините, мне нужен constexpr
, а не просто const
.
Просто создайте
func_do1Pass2
constexpr. Смотрите демо