我的好友和我最近一直在阅读leveldb源代码.我们遇到了这个问题.在leveldb db/skiplist.h文件中,有一个构造函数声明:
explicit SkipList(Comparator cmp, Arena* arena);
Run Code Online (Sandbox Code Playgroud)
我知道带有单个参数的显式构造函数意味着没有构造函数参数的隐式类型转换.但是具有显式关键字的双参数构造函数意味着什么?这是C++ 11的新规则吗?
谢谢.
我有这个递归函数:
f(n) = 2 * f(n-1) + 3 * f(n-2) + 4
f(1) = 2
f(2) = 8
Run Code Online (Sandbox Code Playgroud)
我从经验中知道它的明确形式是:
f(n) = 3 ^ n - 1 // pow(3, n) - 1
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何方法可以证明这一点.我google了一下,但没有找到任何简单的理解.我已经知道生成函数可能解决了它,它们太复杂了,我宁愿不进入它们.我正在寻找一种更简单的方法.
PS如果它有帮助我记得这样的东西解决了它:
f(n) = 2 * f(n-1) + 3 * f(n-2) + 4
// consider f(n) = x ^ n
x ^ n = 2 * x ^ (n-1) + 3 * x ^ (n-2) + 4
Run Code Online (Sandbox Code Playgroud)
然后你以某种方式计算x导致显式形式的递归公式,但我不记得了
我已经扩展了std :: string来满足我不得不将自定义函数构建编写到名为CustomString的字符串类中的需求
我已经定义了构造函数:
class CustomString : public std::string {
public:
explicit CustomString(void);
explicit CustomString(const std::string& str);
explicit CustomString(const CustomString& customString);
//assignment operator
CustomString& operator=(const CustomString& customString);
... };
Run Code Online (Sandbox Code Playgroud)
在第三个构造函数(复制构造函数)和赋值运算符中,其定义为:
CustomString::CustomString(const CustomString& customString):
std::string(static_cast<std::string>(customString))
{}
CustomString& CustomString::operator=(const CustomString& customString){
this->assign(static_cast<std::string>(customString));
return *this;
}
Run Code Online (Sandbox Code Playgroud)
首先,因为这是"明确的"; 意味着需要显式转换以分配给另一个CustomString对象; 它抱怨任务.
CustomString s = CustomString("test");
Run Code Online (Sandbox Code Playgroud)
我不确定在哪里确实需要铸造.
如果复制构造函数不是显式的,那么代码可以正常工作,但我想知道并实现显式定义而不是"猜测正确的强制转换".
让我通过一个例子提出我的问题.
#include <memory>
std::unique_ptr<int> get_it() {
auto p = new int;
return p;
}
int main() {
auto up ( get_it() );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
无法编译时出现以下错误:
a.cpp:5:9: error: could not convert ‘p’ from ‘int*’ to ‘std::unique_ptr<int>’
return p;
^
Run Code Online (Sandbox Code Playgroud)
为什么没有从原始指针自动转换为唯一的指针?我应该做什么呢?
动机:我理解使用智能指针清除所有权应该是一种好习惯; 我从某个地方得到一个指针(我拥有),就像int*
在这种情况下一样,我(想想我)想要它unique_ptr
.
如果您正在考虑评论或添加您自己的答案,请在提案N4029中解决Herbert Sutter关于此问题的论点.
我经常听到人们称赞语言,框架,结构等是"明确的".我试图理解这个逻辑.语言,框架等的目的是隐藏复杂性.如果它让你明确指定所有类型的细节,那么它不会隐藏太多的复杂性,只会移动它.什么是显性的如此伟大,你如何使语言/框架/ API"明确",同时仍然使其服务于隐藏复杂性的目的?
我很好奇将double转换为int的最佳方法.运行时安全是我的主要关注点(它不一定是最快的方法,但这将是我的次要问题).我已经留下了一些我可以在下面提出的选项.任何人都可以权衡哪种是最佳做法?有没有更好的方法来实现这个我没有列出?
double foo = 1;
int bar;
// Option 1
bool parsed = Int32.TryParse(foo.ToString(), out bar);
if (parsed)
{
//...
}
// Option 2
bar = Convert.ToInt32(foo);
// Option 3
if (foo < Int32.MaxValue && foo > Int32.MinValue) { bar = (Int32)foo; }
Run Code Online (Sandbox Code Playgroud) 为什么我需要显式转换number 0
到char
使用其追加到字符串之前string::operator+
?
using namespace std;
int main()
{
string s = "";
s += 65; // no compile error
s += (char)0; // requires explicit cast
//s += 0; // compile error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新澄清:我的目标是将一个字节(包含任何值,包括零)附加到现有的字节数组.
我正在尝试创建以下结构:
[StructLayout(LayoutKind.Explicit, Size=14)]
public struct Message
{
[FieldOffset(0)]
public ushort X;
[FieldOffset(2)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
private ushort[] Y;
[FieldOffset(12)]
public ushort Z;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
无法从程序集中加载"消息"类型,因为它包含偏移4处的对象字段,该字段未正确对齐或由非对象字段重叠.
有谁知道为什么这会导致错误?
注意:我不能使用Pack因为我正在使用紧凑的框架.谢谢.
我正在阅读C++教程,但它实际上并没有给我两者之间的区别(除了语法).这是教程中的引用.
您还可以在声明时为变量赋值.当我们使用赋值运算符(等号)为变量赋值时,它被称为显式赋值:
Run Code Online (Sandbox Code Playgroud)int nValue = 5; // explicit assignment
您还可以使用隐式赋值为变量赋值:
Run Code Online (Sandbox Code Playgroud)int nValue(5); // implicit assignment
即使隐式赋值看起来很像函数调用,编译器也会跟踪哪些名称是变量,哪些是函数,以便可以正确解析它们.
有区别吗?比另一个更优先吗?
struct A
{
// error C2216: 'explicit' cannot be used with 'virtual'
virtual explicit operator bool() const
{
return true;
}
};
struct B : A
{
// error C2216: 'explicit' cannot be used with 'override'
explicit operator bool() const override
{
return false;
}
};
int main()
{
if (A())
{}
if (B())
{}
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是VC++ 2013 RC.
为什么explicit
不兼容virtual
?
理由是什么?