2012-03-25 3 views
1

Я пытаюсь скомпилировать код в Visual Studio (2008) и g ++.
В vs2008 это успешно, но в g ++ он сообщил об ошибке.
если добавить const,
test(const test &source):a(source.a) {}
g ++ скомпилируется успешно.
Я знаю, что test aa = 2; создаст временный объект и вызовет экземпляр-конструктор.
временный объект не может связываться с неконстантной ссылкой
так, почему vs2008 может скомпилировать его успешно?о vs/g ++ с copy-constructor

class test{ 
public: 
    test():a(1) {} 
    test(int num):a(num) {} 
    test(test &source):a(source.a) {} 
private: 
    int a; 
}; 

int main(){ 
    test aa = 2; 
    return 0; 
} 

ответ

3

У VS есть нестандартное расширение, которое позволяет это, к сожалению.

Существует флаг компилятора для отключения расширений, но последний раз, когда я проверил его, также невозможно использовать стандартную библиотеку. Лучше всего держать уровень предупреждения на 4 (хотя в этой конкретной ситуации не возникает никаких предупреждений), и, если это возможно, проверьте свои компиляции с несколькими компиляторами.

+0

Для этого, к сожалению, нет предупреждений./Za отключит нестандартное поведение, но/Za не рекомендуется использовать. –

+0

@JamesMcNellis: Ах, вы правы, даже с '/ Wall' (который в принципе непригодным для использования). Он * предупреждает с помощью 'test aa = test (2);', что и должно быть, но, увы, не иначе. – GManNickG

+0

@JamesMcNellis: Я нахожу, что vs не вызывает copy-constructor, он вызывает 'test (int num)'. – skeu

Смежные вопросы