Подтвердить что ты не робот

Разница между std: string и std::string

В одной функции моего кода я обнаружил ошибку. Было написано std:string:

const std::string currentDateTime() {
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    //strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);
    strftime(buf, sizeof(buf), "%Y%m%d%X", &tstruct);

    std:string str = buf;

    str.erase(std::remove(str.begin(), str.end(), ':'), str.end());
    return str;
}

Код компилируется без ошибок. Почему он компилируется? Что означает std:string?

4b9b3361

Ответ 1

Он интерпретируется как метка, которая может использоваться с goto.

int main()
{
    //label to jump to:
    label_name:
    //some code
    <..>
    //some code
    goto label_name;//jump to the line with the lable
}

Очевидно, это была опечатка. Ваш код скомпилирован, потому что using namespace std; или using std::string был использован где-то выше. В противном случае вы получите ошибку "строка не была объявлена ​​в этой области".

Ответ 2

Я думаю, что он компилируется, потому что в файле была использована вышеописанная директива "using namespace std; "(или, что еще хуже, в другом включенном файле).

Итак, компилятор видит "std:" как метку goto и использует (std::)string, потому что используется "using namespace std".

Обычно на современном компиляторе у вас может быть предупреждение, что-то вроде (в gcc):

  warning: label ‘std’ defined but not used

Ответ 3

std: используется как метка, которая может использоваться как цель goto. Должен быть с помощью директивы в вашем коде:

using std::string;

или

using namespace std; 

Также см. Почему "using namespace std;" считается плохой практикой?.

Это демонстрирует важность использования предупреждений. Я могу получить Visual Studio, gcc и clang, чтобы предупредить об этом, используя правильные флаги. Для Visual Studio с помощью /W3 выдается следующее предупреждение (видеть его в прямом эфире):

предупреждение C4102: 'std': ярлык без ссылок

Для этого кода:

#include <string>

using std::string ;

int main()
{
    std:string s1 ;
}

Для gcc и clang с использованием -Wall было достаточно, для gcc я получаю следующее:

warning: label 'std' defined but not used [-Wunused-label]
 std:string s1 ;
 ^

и аналогичное предупреждение от clang.