LINUX.ORG.RU

что такое type qualifiers ignored on function return type


0

0

есть файлик:
1.h
в нем
namespace file_operation {
using namespace mesgs;
inline const double Strtod(const char *nptr, char **endptr);
};

есть 1.cpp
в нем:
namespace file_operation {
const double Strtod(const char *nptr, char **endptr)
{

assert(nptr);

double return_val = 0;
return_val = strtod(nptr, endptr);

if (ERANGE == errno)
{
string str = get_time();
str += error_code.get_error_info(Errors_code::CANT_CONVERT_TO_DOUBLE);
str += error_code.get_error_info(Errors_code::BECOSE);
str += strerror(errno);
str += error_code.get_error_info(Errors_code::NEW_LINE);

mesgs::message(str);
}

return return_val;
}
};

когда компилирую этим gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)
, все происходит нормально, когдаже эти: gcc version 4.3.2 20081007 (Red Hat 4.3.2-7) (GCC) получаю ворнинг type qualifiers ignored on function return type с указанием на 1.h файла где обьявление, что значит то?

ха уходит если убрать const, или -Wextra из деректифф компилятору

hello_world
() автор топика

Небольшой офф - кажется, что тело inline-функции должно быть в хидере.

ant
()
Ответ на: комментарий от hello_world

> ну а смысл то какой

ты поставил const в место в котором этот const не имеет никакого смысла. На бессмысленные действия компилятор иногда дает варнинги, потому что думает, что ты мог что-то перепутать.

dilmah ★★★★★
()
Ответ на: комментарий от hello_world

> Почему не имеет смысла? Strtod(a, b) = 4

для этого нужно ссылку возвращать.

А без ссылки это ошибка -- попытка использования rvalue в качестве lvalue.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

не совсем понятно почему для простого типа (int double...) это выражение действительно не проходит, но для сложного (например string) идет вполне?

hello_world
() автор топика
Ответ на: комментарий от hello_world

вызывается оператор присваивания для временного объекта, возвращаемого функцией 

#include <iostream>
#include <string>

using namespace std;

class X
{
	string s;
public:
	X (const char* a)
	{
		s = a;
		cout << "конструктор для \""  << a << "\"" << endl;
	}	
	void operator = (const X& x)
	{
		cout << "оператор для \"" << s << "\" от \"" << x.Get()  << "\"" << endl;
	}
	string Get() const
	{
		return s;
	}
};

X f()
{
	return "возврат значения";
}

int main(int argc, char *argv[])
{

	f() = "присваивание";
        return 0;
}

Вывод программы :

конструктор для "присваивание"
конструктор для "возврат значения"
оператор для "возврат значения" от "присваивание"

vasil
()

Для встроеных типов языка считается, что возращаемое значение функции есть rvalue

Другими словами там уже неявно подразумевается const

а вот для пользовательских типов это не так

Den_Bayer
()
Ответ на: комментарий от vasil

я чего то не догоняю? где копирующий конструктор?
#include <iostream>
#include <string>

using namespace std;

class X
{
	string s;
public:
	explicit X (const char* a)
	{
		s = a;
		cout << "конструктор для \""  << a << "\"" << endl;
	}

	X (const X& a)
	{
		cout << ".";
		s = a.s;
		cout << "копирующий конструктор для \""  << a.s.c_str() << "\"" << endl;
	}
	X& operator = (const X& x)
	{
		cout << "оператор для \"" << s << "\" от \"" << x.Get()  << "\"" << endl;
		s = x.Get();
		return *(const_cast<X*>(this) );
	}
	string Get() const
	{
		return s;
	}
};

X f()
{
	X x("возврат значения");
	return x;
}

int main(int argc, char *argv[])
{
    f() = X("присваивание") = X("prisvaivanie");
    cout << "....." << endl;
    X(f());
    cout << "....." << endl;
    return 0;
}

₵/usr/bin/g++43 1.cpp && ./a.out
конструктор для "prisvaivanie"
конструктор для "присваивание"
оператор для "присваивание" от "prisvaivanie"
конструктор для "возврат значения"
оператор для "возврат значения" от "prisvaivanie"
.....
.....
₵

hello_world
() автор топика
Ответ на: комментарий от Den_Bayer

а так?

#include <iostream>
#include <string>

using namespace std;


void RR(const string&)
{
        cout << "пусто" << endl;
}

void RR(string& x)
{
        cout << "не пусто: " << x << endl;
}

int main()
{
   RR(string());
   return 0;
};

hello_world
() автор топика
Ответ на: комментарий от hello_world

> я чего то не догоняю? где копирующий конструктор?
там почему-то не происходит даже вызова функции f() в выражении X(f());
Вызов функции появляется, если к ней добавить какой-нибудь параметр, например X(f(4));,
или вызвать какую-нибудь функцию объекта, например X(f()).print();

vasil
()
Ответ на: комментарий от vasil

когда X(f()) само по себе X(f()); компилятор понимает это как объявление функции X f(); , а когда в составе выражения a + X(f()) , то как вызов f() и создание объекта X

vasil
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.