2014-02-26 91 views
2
#include <iostream> 
#include <vector> 
#include <boost/shared_ptr.hpp> 
#include <boost/make_shared.hpp> 
using namespace std; 

struct TestMe 
{ 
    TestMe() : i(10), j(20) {} 
    int i; 
    int j; 
}; 

int main() 
{ 
    // Case I: 
    //vector<const int> vec; 
    /* 
/usr/local/gcc-4.8.1/include/c++/4.8.1/ext/new_allocator.h:93:7: error: 'const _Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::const_reference) const [with _Tp = const int; __gnu_cxx::new_allocator<_Tp>::const_pointer = const int*; __gnu_cxx::new_allocator<_Tp>::const_reference = const int&]' cannot be overloaded 
     address(const_reference __x) const _GLIBCXX_NOEXCEPT 
    */ 

    // Case II:   
    //vector<const TestMe> vecTest; 

    // Case III: 
    //boost::shared_ptr<vector<const TestMe>> shVecTestMe; 
    //shVecTestMe = boost::make_shared<vector<const TestMe> >();  
    return 0; 
} 

我曾嘗試在兩個編譯器上面的代碼:使用<const T>`

1>http://www.compileonline.com/compile_cpp11_online.php

2> MS VS2010

第一編譯器不能接受所有的情況下(即案例一,案例二,案例三)。 但是,MS VS2010接受了所有這些。

問題1>案例是否有意義?換句話說,是否有必要使用

vector<const int> 
vector<const TestMe> 
boost::shared_ptr<vector<const TestMe>> 

以防止包含的值被稍後修改。

問題2>爲什麼兩個編譯器在這些情況下有不同的響應。基於C++標準哪一個是正確的?

謝謝

+1

爲了給你一個答案,不允許你在每個標準的STL容器中使用const。這樣做會導致未定義的行爲。類似的線程:http://stackoverflow.com/questions/4940419/vc-allows-to-use-const-types-for-stl-containers-why – jakebower

回答

0

定義一個const對象意味着它在創建後不會改變。因此,除非您引用編譯時已經存在的const對象,否則不能創建const int向量。

問題是......爲什麼需要這個?人們總是改變你的矢量嗎?

還有其他一些機制來執行此操作,如類中的私有向量。

0

正如評論和可能重複的問題及其答案中所述,這會導致未定義的行爲,這就是爲什麼編譯器/庫實現的行爲不同。例如,GCC的庫實現嘗試通過const和非const引用超載一個方法,如果引用類型已經爲const,則該引用將失敗。

但它也沒有意義。你只能說

const vector<int> vec; 

,如果有什麼事,你越有可能實現,我不能想象你vector <const int>,如果它是有效的。

相關問題