标签: const

是strtol,strtod不安全吗?

似乎strtol()并且strtod()有效地允许(并强制)你在字符串中抛弃constness:

#include <stdlib.h>
#include <stdio.h>

int main() {
  const char *foo = "Hello, world!";
  char *bar;
  strtol(foo, &bar, 10); // or strtod(foo, &bar);
  printf("%d\n", foo == bar); // prints "1"! they're equal
  *bar = 'X'; // segmentation fault
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面,我自己没有演出.然而,strtol()基本上把我const char *变成了一个char *对我来说,没有任何警告或任何东西.(事实上,它不会让你输入barconst char *,所以迫使类型的不安全的变化.)是不是真的很危险?

c const const-char std c-strings

15
推荐指数
2
解决办法
4886
查看次数

C++常量引用生命周期(容器适配器)

我的代码看起来像这样:

class T {};

class container {
 const T &first, T &second;
 container(const T&first, const T & second);
};

class adapter : T {};

container(adapter(), adapter());
Run Code Online (Sandbox Code Playgroud)

我认为不断引用的生命周期将是容器的寿命.但是,否则看起来,在创建容器后销毁适配器对象,留下悬空引用.

什么是正确的寿命?

适配器临时对象的堆栈范围是容器对象或容器构造函数的范围?

如何正确实现绑定临时对象到类成员引用?

谢谢

c++ const reference lifetime

15
推荐指数
2
解决办法
7565
查看次数

返回引用的Const方法

class Foo
{
    int Bar;

    public:

    int& GetBar() const
    {
        return Bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

GetBar是一种const方法吗?它实际上并没有改变任何东西,但它为"外部世界"提供了一种改变它的方法.

c++ methods const class

15
推荐指数
1
解决办法
1万
查看次数

为什么C#不提供类似于C++的constness?

C#中的引用与C++中的引用非常相似,只是它们是垃圾回收的.

为什么C#编译器支持以下内容如此困难:

  1. 会员职能标记const.
  2. 引用标记的数据类型(字符串除外)const,通过它只能const调用成员函数?

我相信如果C#支持这个会非常有用.首先,它真的有助于看似广泛的同性恋放弃C#程序员返回裸体引用私人数据(至少这是我在我的工作场所看到的).

或者在C#中我已经缺少了相同的东西?(我知道关键字readonlyconst关键字,但它们并没有真正满足上述目的)

c# compiler-construction const reference constants

14
推荐指数
3
解决办法
1186
查看次数

在C++中使所有类型默认为常量

什么是向编译器指示的最简单和最不突兀的方式,无论是通过编译器选项,#defines,typedefs还是模板,每次我说T,我的意思是T const什么?我宁愿不使用外部预处理器.由于我不使用mutable关键字,因此可以接受重新调整以指示可变状态.

编辑:由于这个意图完全是错误的(因为我不在几个小时内澄清),让我解释一下.本质上,我只想知道在编译时可以使用哪些系统来操作类型系统.我不在乎这是否会产生非标准,错误,不可维护,无用的代码.我不打算在生产中使用它.这只是一种好奇心.

到目前为止的潜在(次优)解决方案:

// I presume redefinition of keywords is implementation-defined or illegal.
#define int int const
#define ptr * const
int i(0);
int ptr j(&i);

typedef int const Int;
typedef int const* const Intp;
Int i(0);
Intp j(&i);

template<class T>
struct C { typedef T const type; typedef T const* const ptr; };
C<int>::type i(0);
C<int>::ptr j(&i);
Run Code Online (Sandbox Code Playgroud)

c++ functional-programming const immutability language-extension

14
推荐指数
1
解决办法
1221
查看次数

"const"在C和C++中有何不同?

变量的const限定如何在C和C++中有所不同?

来自:"const"只是意味着只读还是更多?

"提出这个问题的原因是这个答案:https://stackoverflow.com/questions/4024318#4024417其中他声明const"just"在C中意味着只读.我认为所有const都意味着,无论它是C还是C++.他是什么意思?"

c c++ const

14
推荐指数
2
解决办法
4763
查看次数

"static const int"导致链接错误(未定义引用)

使用以下代码时,我对链接器错误感到困惑:

// static_const.cpp -- complete code
#include <vector>

struct Elem {
    static const int value = 0;
};

int main(int argc, char *argv[]) {
    std::vector<Elem> v(1);
    std::vector<Elem>::iterator it;

    it = v.begin();
    return it->value;
}
Run Code Online (Sandbox Code Playgroud)

但是,这在链接时失败 - 不知何故,它需要有一个静态const"值"的符号.

$ g++ static_const.cpp 
/tmp/ccZTyfe7.o: In function `main':
static_const.cpp:(.text+0x8e): undefined reference to `Elem::value'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这与-O1或更好的编译很好; 但对于更复杂的情况,它仍然失败.我使用的是gcc版本4.4.4 20100726(Red Hat 4.4.4-13).

任何想法我的代码可能有什么问题?

c++ static gcc const stdvector

14
推荐指数
2
解决办法
1万
查看次数

为什么std :: reference_wrapper <const T>不接受临时?

通常,rvalues可以绑定到const引用(const SomeType&).它内置于语言中.但是,std::reference_wrapper<const T>不接受rvalue作为其构造函数参数,因为故意删除了相应的重载.这种不一致的原因是什么?std::reference_wrapper当我们必须传递值但希望保留引用语义时,"广告"作为引用变量的替代.

换句话说,如果const &绑定的右值被认为是安全的,因为它内置于语言中,为什么C++ 11的设计者不允许包含rvalues std::reference_wrapper<const T>

什么时候会派上用场,你可能会问.例如:

class MyType{};

class Foo { 
public:
    Foo(const MyType& param){} 
};

class MultiFoo {
public:
    MultiFoo(std::initializer_list<std::reference_wrapper<const MyType>> params){} 
};

int main()
{
    Foo foo{MyType{}}; //ok
    MultiFoo multiFoo{MyType{}, MyType{}}; //error
}
Run Code Online (Sandbox Code Playgroud)

c++ const rvalue c++11 reference-wrapper

14
推荐指数
2
解决办法
2966
查看次数

成员函数有时是const

我有一个类似于以下的类设计:

class MyClass {
public:
    bool IsValid() const;
    void MakeValid();
private:
    bool CheckValidity(bool fix);
};

bool MyClass::IsValid() const {
    // Check validity, but don't fix any problems found.  Doesn't work.
    return CheckValidity(false);
}

void MyClass::MakeValid() {
    // Check validity and fix problems found.
    CheckValidity(true);
}
Run Code Online (Sandbox Code Playgroud)

IsValid应该是const,因为它没有做出改变.MakeValid应该是非const的,因为它确实会发生变化.它们共享相同的实现,CheckValidity但由于CheckValidity可能会或可能不会进行更改,因此无法进行标记const.

处理这个问题的最佳方法是什么?最简单的方法是使用const_cast,但抛弃const感觉有点脏:

bool MyClass::IsValid() const {
    // Check validity, but don't fix any problems found.
    return const_cast<MyClass*>(this)->CheckValidity(false);
}
Run Code Online (Sandbox Code Playgroud)

这是合法使用的const_cast吗?有更好的方法吗?

c++ const

14
推荐指数
2
解决办法
771
查看次数

为什么const int对于char brace init很好?

我以为括号初始化不允许缩小。但是为什么int const允许char括号初始化?

int value1 = 12;
char c1{value1};  // error! no narrowing

const int value2 = 12;
char c2{value2};   // why is this fine?
Run Code Online (Sandbox Code Playgroud)

在Godbolt上看到它。

c++ const narrowing c++11

14
推荐指数
1
解决办法
164
查看次数