Непосредственное преобразование из строкового литерала в unsigned int (bool) [duplicate]

Убедитесь, что сценарий содержит

<?php

перед кодом, который должен быть выполнен. Между <? и php в этом не должно быть пробелов.

25
задан M.M 16 October 2014 в 22:58
поделиться

2 ответа

"Hello World" является строковым литералом типа «массив из 12 const char», который может быть преобразован в «указатель на const char», который, в свою очередь, может быть преобразован в bool. Это именно то, что происходит. Компилятор предпочитает это использовать конструктор преобразования std::string.

Последовательность преобразования, включающая конструктор преобразования, известна как пользовательская последовательность преобразования . Преобразование из "Hello World" в bool является стандартной последовательностью преобразования . В стандарте указано, что стандартная последовательность преобразования всегда лучше, чем пользовательская последовательность преобразований (§13.3.3.2 / 2):

стандартная последовательность преобразования (13.3.3.1.1) представляет собой лучшая последовательность преобразования, чем пользовательская последовательность преобразования или последовательность преобразования многоточия

. Этот анализ «лучшей последовательности преобразований» выполняется для каждого аргумента каждой жизнеспособной функции (и у вас есть только один аргумент) и лучшая функция выбирается с помощью разрешения перегрузки.

Если вы хотите убедиться, что вы выбрали версию std::string, вам нужно дать ей std::string:

Output::Print(std::string("Hello World"));
35
ответ дан Joseph Mansfield 21 August 2018 в 12:38
поделиться
  • 1
    @LuchianGrigore Я согласен, что это более глубокий вопрос. Я просто не уверен, что ОП даже знает, что он спросил это = P – WhozCraig 8 February 2013 в 12:20
  • 2
    Да, я пробовал это, что сработало ... просто кажется неопрятным !, Я изменил объявление метода на Print (const char * value), который, похоже, тоже работает ... Не уверен, что здесь лучше всего! – series0ne 8 February 2013 в 12:22
  • 3
    @LuchianGrigore Я бросил это там. – Joseph Mansfield 8 February 2013 в 12:27
  • 4
    @ series0ne На самом деле вы можете иметь как перегрузки - на std::string (или предпочтительно const std::string&), так и на const char*. – Angew 8 February 2013 в 12:45
  • 5
    Как заставить ошибку или «исправить» (в смысле ожидаемого) перевода, если кто-то называет Output::Print("Hello World"), который переводится на Output::Print(bool value), чего не ожидают? – kirsche40 17 February 2014 в 16:03

FWIW, он может быть адресован таким образом (если шаблоны могут использоваться), если вы не хотите добавлять перегрузки для const char*.

#include <iostream>
#include <string>
#include <type_traits>

template <typename Bool,
          typename T = std::enable_if_t<std::is_same<Bool, bool>{}>>
void foo(Bool)
{
  std::cerr << "bool\n";
}

void foo(const std::string&)
{
  std::cerr << "string\n";  
}

int main()
{
  foo("bar");
  foo(false);
}
2
ответ дан akim 21 August 2018 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: