似乎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 *对我来说,没有任何警告或任何东西.(事实上,它不会让你输入bar的const char *,所以迫使类型的不安全的变化.)是不是真的很危险?
我的代码看起来像这样:
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)
我认为不断引用的生命周期将是容器的寿命.但是,否则看起来,在创建容器后销毁适配器对象,留下悬空引用.
什么是正确的寿命?
适配器临时对象的堆栈范围是容器对象或容器构造函数的范围?
如何正确实现绑定临时对象到类成员引用?
谢谢
class Foo
{
int Bar;
public:
int& GetBar() const
{
return Bar;
}
}
Run Code Online (Sandbox Code Playgroud)
这GetBar是一种const方法吗?它实际上并没有改变任何东西,但它为"外部世界"提供了一种改变它的方法.
C#中的引用与C++中的引用非常相似,只是它们是垃圾回收的.
为什么C#编译器支持以下内容如此困难:
const.const,通过它只能const调用成员函数?我相信如果C#支持这个会非常有用.首先,它真的有助于看似广泛的同性恋放弃C#程序员返回裸体引用私人数据(至少这是我在我的工作场所看到的).
或者在C#中我已经缺少了相同的东西?(我知道关键字readonly和const关键字,但它们并没有真正满足上述目的)
什么是向编译器指示的最简单和最不突兀的方式,无论是通过编译器选项,#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
变量的const限定如何在C和C++中有所不同?
"提出这个问题的原因是这个答案:https://stackoverflow.com/questions/4024318#4024417其中他声明const"just"在C中意味着只读.我认为所有const都意味着,无论它是C还是C++.他是什么意思?"
使用以下代码时,我对链接器错误感到困惑:
// 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).
任何想法我的代码可能有什么问题?
通常,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) 我有一个类似于以下的类设计:
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吗?有更好的方法吗?
我以为括号初始化不允许缩小。但是为什么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上看到它。