C++ 有没有一种方法可以在声明变量后构造它?

C++ 有没有一种方法可以在声明变量后构造它?,c++,c,constants,C++,C,Constants,可能重复: 有时在C或C++中我们有一个变量,可能是const,但是我们必须用一些代码来初始化它。 有没有办法告诉编译器,从函数中的某个点开始,某些已经构造的变量必须被视为常量,直到其作用域结束 比如: int c = 0; // the value of c is initialized here switch(someVar) { case foo: c = 3; break; case bar: c = 4; break; default : c = 42; // wh

可能重复:

<>有时在C或C++中我们有一个变量,可能是const,但是我们必须用一些代码来初始化它。 有没有办法告诉编译器,从函数中的某个点开始,某些已经构造的变量必须被视为常量,直到其作用域结束

比如:

int c = 0;
// the value of c is initialized here
switch(someVar) {
   case foo: c = 3; break;
   case bar: c = 4; break;
   default : c = 42; // what else?
}
// now c is constant
ASSUME_CONST_FROM_NOW(c) // some #pragma maybe?
我知道我可以在专用函数中初始化变量。这不是我真正想要的

另一个例子:

int c = 0; int d = 0;
{ /*some block of code that initializes both c and d jointly*/ }
ASSUME_CONST_FROM_NOW(c, d)
没有一个函数可以在不创建结构或类的情况下一次返回两个值

但是这样一个技巧可能很有用,可以使旧的、蹩脚的代码更容易理解,而不需要太多的重构。

是的

将初始化放在函数中

int getInitCValue(int const& someVar)
{
    // the value of c is initialized here
    switch(someVar)
    {
        case foo: return 3;
        case bar: return 4;
        default : return 42; // what else?
    }
}

int const c = getInitCValue(someVar);
编辑:回答修改后的问题。 您要初始化两个值:

std::pair<int,int> const value = initalizePairOfValues(someValue);
int const& c = value.first;
int const& d = value.second;

在C++0x中,可以执行以下操作:

int const c = []() -> int { 
    int r; 
    switch(42) { 
    case 3: 
        r = 1; break; 
    case 4: 
        r = 2; break; 
    default: 
        r = 23; 
    }; 
    return r; 
}();

如果您愿意在代码周围提供一些
{}
,以查看变量
const
,是的,至少是类似的内容。在宏中放置以下内容:

#define CONSTIFY(T, NAME)                  \
for (bool p00 = true; p00; p00=false)      \
for (T p000 = NAME; p00; p00=false)        \
for (T const NAME = p000; p00; p00=false)
<>这应该在C99以及C++中工作。从技术上讲,这不会使原始变量
const
,而是为依赖范围创建具有相同内容的新变量


请注意,在某些情况下(
中断
继续
),这可能会改变控制流。但是,只要你把它包装在一个基本上是整个函数体的东西上,它就会工作。

…你是说通过函数初始化?这正是我在问题的最后所说的。我知道我应该这样做。但有时这个建议会导致太多的工作。有时,be也可以同时初始化两个变量。@Benoit:你是wright,如果不创建一个类,就不能返回两个值。但是您可以使用已经存在的类。std::pair非常适合两个值,boost::touple非常适合一组值。@Benoit:use
boost::tie
和@Martin York的建议。我想你的意思是
std::pair
,如果你不介意的话,我更正了你的帖子。@mAlters:谢谢,我还没有看到那个。你为什么要这么做?更具体地说,为什么它如此重要,以至于您已经准备好使用非标准且不可移植的pragma来实现这一点?无论如何,基本上(在C中)你不能“构造”一个非常量变量。一旦一个变量是非常量的,您就可以(如果您愿意的话)安全地丢弃任何常量限定符来访问该变量。这不是完全的重复,因为在这个问题上没有关于允许C++0x解决方案的提示。试图为另一个问题提出一个复杂的C++03解决方案将是一个糟糕的/不必要的复杂答案。对于这个问题,正如目前所说,这将是一个必然复杂的答案。我不知道为什么,但它看起来像Javascript…智能,但这是在要求以后的痛苦世界…:D@Nim:我同意,你不应该把这个留在代码里。但是为了快速检查一些遗留代码以查看是否有人试图更改变量,这可能仍然有帮助。此外,如果复制构造函数(如
auto_ptr
s,我同意不应该使用)很棘手,这可能会导致数据丢失。@Benoit,我现在太多地使用C语言了。对于问题中的
int
,这应该不会有太大变化。对于C++,确实是这样,假设复制构造函数是可访问的。为什么这会导致数据丢失,我不明白。auto_ptr析构函数调用delete[]。因此,如果目的是共享指针,则永远不应复制该指针,仅当指针的所有者应被转移时。
#define CONSTIFY(T, NAME)                  \
for (bool p00 = true; p00; p00=false)      \
for (T p000 = NAME; p00; p00=false)        \
for (T const NAME = p000; p00; p00=false)