2 回答
TA贡献1883条经验 获得超3个赞
除非定义了 const,否则无法对其进行初始化。你必须找到一种方法来知道它的定义价值。如果 很难确定 的值,请考虑使用函数的结果,例如x
const int x = calc_x();
或类似的闭包
const int x = []() { /* code to calculate x's value */ }();
const
ness 是对象类型的一部分,并且对象类型在任何情况下都不能更改,因此要么是,您以后无法初始化它,要么根本不是。x
const
x
const
可以设计一个可以模拟此内容的包装器,但您最多只能得到一个运行时错误。class
请注意,似乎可能存在以下形式的解决方案,但假设所讨论的对象实际上不是 。在初始化后无法合法更改其值的情况下。const_cast
const
const int x
TA贡献1864条经验 获得超2个赞
C++没有内置功能。不过,您可以自己构建它。您可以创建一个类来保存所需类型的对象的存储空间,并且可以重载该对象的赋值运算符,以便只能调用和初始化一次。这看起来像
template<typename T>
class once
{
private:
std::aligned_storage_t<sizeof(T), alignof(T)> data;
T* ptr = nullptr;
public:
once() = default;
~once()
{
if(ptr) // it is initialized so call the destructor
ptr->~T();
// optionally you can add
// throw("a once<T> must be initialized once");
// this can help to enforce that the object is actually initialized as you'll get a runtime exception in code that does not do so
}
template<typename U>
once& operator =(U&& value)
{
if (!ptr) // it is not initialized so call constructor
{
ptr = new(&data) T(std::forward<U>(value));
}
else
throw ("can only assign to a once<T> once.");
return *this;
}
operator const T&()
{
return *ptr;
}
};
然后你会像这样使用它
int main()
{
once<int> foo;
if (1 < -1)
foo = 21;
else
foo = 42;
std::cout << foo;
//foo = 23; // uncomment this to get an exception.
}
添加回答
举报