День добрый.
Внезапно возник глупый вопрос не по C++11
https://ideone.com/smJnew
Почему тут ошибка? Недочет языка? Или в стандарте прописали что так делать нельзя?
#include <iostream>
using namespace std;
template <class T>
T GetVal(int a, T b)
{
return b + 1;
}
int main() {
cout << GetVal<long long>(1, 2) << endl;
cout << GetVal(1,int(3)) << endl;
cout << GetVal(1,char(52)) << endl;
cout << GetVal(1,long long(52)) << endl; <------------ тут ошибка компиляции
return 0;
}
prog.cpp:14:19: error: expected primary-expression before 'long'
cout << GetVal(1,long long(52)) << endl;
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Здравствуйте, k55, Вы писали:
k55>k55> cout << GetVal(1,long long(52)) << endl; <------------ тут ошибка компиляции
k55> return 0;
k55>}
k55>prog.cpp:14:19: error: expected primary-expression before 'long'
k55> cout << GetVal(1,long long(52)) << endl;
k55>
Попробуй так
cout << GetVal(1, (long long)(52)) << endl;
Здравствуйте, k55, Вы писали:
k55>k55> cout << GetVal(1,long long(52)) << endl; <------------ тут ошибка компиляции
k55>
В стандарте в 5.2.3 "Explicit type conversion (functional notation)" написано следующее:
A simple-type-specifier (7.1.6.2) or typename-specifier (14.6) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).
В 5.4 "Explicit type conversion (cast notation)", напомню, рассматривается синтаксис:
(T) expression
Теперь посмотрим, что такое simple-type-specifier:
simple-type-specifier:
nested-name-specifier? type-name
nested-name-specifier template simple-template-id
char
char16_t
char32_t
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
auto
decltype-specifier
То есть допускаются только одиночные type-specifier. long long, как и, например, short int состоят из нескольких type-specifier и не подходят к functional notation синтаксису.
Здравствуйте, k55, Вы писали:
А почему не
#include <iostream>
#include <typeinfo>
using namespace std;
template <class T>
T GetVal(int a, T b)
{
cout << typeid(b).name() << ": ";
return b + 1;
}
int main() {
cout << GetVal<long long>(1, 2) << endl;
cout << GetVal(1,int(3)) << endl;
cout << GetVal(1,char(52)) << endl;
cout << GetVal(1,static_cast<long long>(52)) << endl;
return 0;
}
sheridan@pc-0019 /tmp $ g++ -o aaa cpp.cpp
sheridan@pc-0019 /tmp $ ./aaa
x: 3
i: 4
c: 5
x: 53