2013-11-27 159 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

将您的函数调用主要更改为函数将工作。但我不知道你想要的最终输出是什么。

相关问题