构造函数创建const对象

时间:2013-11-27 11:21:54

标签: c++

为什么我收到错误

../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 const

中删除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;
}

2 个答案:

答案 0 :(得分:3)

这个电话:

func('x');

要求创建临时BWSize对象(通过调用隐式转换构造函数)。并且您不能将非常量左值引用绑定到临时值。

答案 1 :(得分:0)

将main中的函数调用更改为 func(s)将起作用。但我不知道你想要的最终输出是什么。