Я читал это. Этот вопрос содержит следующую программу.
#include <iostream>
#include <cstdio>
#include <string>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString);
cin.get();
return 0;
}
Я пробовал это на g++ 4.8.1, но компиляция не удалась. g++ 4.8.1 дает следующий диагноз.
9 47 [Error] cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...'
9 47 [Warning] format '%s' expects argument of type 'char*', but argument 2 has type 'std::string {aka std::basic_string<char>}' [-Wformat=]
Что означает эта ошибка? Должна ли эта программа компилироваться успешно или нет? Какой компилятор правильный (g++ или MSVS 2010)? Почему MSVS 2010 принимает этот код? Вызывает ли код неопределенное поведение при компиляции в MSVS 2010?
Удивительно: я попробовал это на ideone, который использует g++ 5.0, и на удивление он компилируется и работает нормально. (См. живую демонстрацию здесь). g++ 5.2.0 выдает предупреждение, когда я компилирую этот код. (См. живую демонстрацию здесь). Почему он отлично компилируется на ideone, но не работает на g++ 4.8.1? g++ 4.8.2 (выдает тот же диагноз, что и g++ 4.8.1, 4.9.0,4.9.1,4.9.2 (выдает ошибку, а не предупреждение). g++ 5.1.0 выдает предупреждение, но программа по-прежнему компилируется и работает нормально.
Почему разные версии g++ ведут себя по-разному при компиляции вышеуказанной программы? Это ошибка в g++? Clang также отклоняет этот код для компиляции в ответ на ответ, данный @TemplateRex
myString
правильно. - person MikeCAT   schedule 17.09.2015