2013-11-27 208 views
1

爲什麼我收到提示構造函數創建const對象

../implicit-explicit.cpp:44:10: error: invalid initialization of non-const reference of type ‘BWSize&’ from an rvalue of type ‘char’ 
../implicit-explicit.cpp:36:6: error: in passing argument 1 of ‘void func(BWSize&)’ 

,當我從函數void func(const BWSize & s)

刪除const根據我的理解構造函數返回的不是常量的值。

代碼

// implicit-explicit.cpp by Bill Weinman <http://bw.org/> 
#include <iostream> 

const std::size_t maxlen = 1024; // maximum length of bwString 

class BWSize { 
    std::size_t _size; 
public: 
    BWSize(std::size_t); // constructor: size from int 
    BWSize(const char *); // constructor: size from c-string 
    std::size_t size() const; 
}; 

BWSize::BWSize(const std::size_t n) { 
    std::cout << "BWSize from int" << std::endl; 
    _size = (n <= maxlen) ? n : 0; 
} 

BWSize::BWSize(const char * s) { 
    std::cout << "constructor: BWSize from c-string" << std::endl; 
    for(std::size_t i = 0; i < maxlen; i++) { 
     if(s[i] == '\0') { 
      _size = i; 
      return; 
     } 
    } 
    _size = 0; 
} 

std::size_t BWSize::size() const { 
    return _size; 
} 

using namespace std; 

void func(const BWSize & s) { 
    cout << "s.size() is " << s.size() << endl; 
} 

int main(int argc, char ** argv) { 
    BWSize s = 'x'; 
    cout << "s.size() is " << s.size() << endl; 
    func('x'); 
    return 0; 
} 
+0

小記:你可以聲明你的構造函數爲'explicit'以避免隱式轉換(如果不需要) – lolando

+0

當然,你不是指'func(「x」)'? – Roddy

回答

3

此調用:

func('x'); 

要求臨時BWSize對象被創建(通過調用一個隱式轉換的構造函數)。而且你不能將非const的左值引用綁定到臨時表。

0

將您的函數調用主要更改爲函數將工作。但我不知道你想要的最終輸出是什麼。

相關問題