LINUX.ORG.RU

С++'ный овощ

 ,


0

0
void func(const std::string &value)
{
    std::cout << "std::string" << std::endl;
}
void func(bool value)
{
    std::cout << "bool" << std::endl;
}

func("std::string");
./bin bool


А вот чо так?

★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

«std::string» != std::string&

dib2 ★★★★★
()

указатель на строку кастуется к bool, а не к типу std::string

anonymous
()

а не так тут то, тчо ты не пошел искат ьответ в гугле, а приперся сюда

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

Походу да. Спасибо.

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

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

mos ★★☆☆☆
()

Вообще-то, если функция принимает параметр по ссылке, то при вызове нельзя указывать значение (не переменную) в качестве параметра. Это недостаток такого метода. Например, вот такое вызовет ошибку компиляции:

void func2(int &a)
{
	std::cout << "value: " << a << std::endl;
}

...

func2(2);

Логика проста: потенциально функция может менять такой параметр, и будет меняться соотв. паременная; а что должно произойти, если было передано значение (как в примере выше), а func2 сделает a=10;?

Другое дело, если функция принимает параметр как const reference. Проверил - gcc не ругается. Но я бы всё равно поостерегя такое практиковать: не уверен что такое прописано в стандарте, а значит может быть компиляторо-зависимым. Плюс еще непонятно как оно будет вести в таком случае как у тебя.

Короче, мой тебе совет: если делаешь функцию, которая принимает параметр по ссылке, при вызове такой функции никогда не указывай значения (не-переменные) как параметры.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от mos

Да мне насрать абсолютно, что вы с аноном тут говорите.

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

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

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

Но я бы всё равно поостерегя такое практиковать: не уверен что такое прописано в стандарте, а значит может быть компиляторо-зависимым

Можно.

http://en.cppreference.com/w/cpp/language/value_category

An rvalue may be used to initialize a const lvalue reference, in which case the lifetime of the object identified by the rvalue is extended until the scope of the reference ends.

Не стандарт конечно, но все же.

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

пруфцы:

«International Standard ISO/IEC 14882:2014(E) Programming Language C++»

The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference...

anonymous
()

Что за цпп без шаблонов? Сколько будет:

#include <iostream>

template <class T> void f(T &i) { std::cout << 1; }

template <> void f(const int &i) { std::cout << 2; }

int main() {
  int i = 42;
  f(i);
}
?

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

необязательно. к std::string тоже должно привестись.

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

Вообще-то, если функция принимает параметр по ссылке, то при вызове нельзя указывать значение (не переменную) в качестве параметра.

правильный ответ проще: литерал «» согласно стандарту неявно кастуется в std::string или const char*, но никак не в std::string&,

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

правильный ответ проще: литерал «» согласно стандарту неявно кастуется в std::string или const char*, но никак не в std::string&,

Тут вопрос терминологии. Я вообще не рассматриваю ссылку как отдельный тип, хотя и понимаю, что «внутри» это скорее указатель.

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

Но стандарт-то рассматривает ссылку как отдельный тип.

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

по правилам вывода аргументов при инстанцировании шаблонов

anonymous
()

попробуй так:

// -std=c++14

using namespace std::literals;

func("std::string"s);
rupert ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Уже разобрались, почему кастуется к bool. Удачи.

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