我正在阅读标准并试图弄清楚为什么没有演员表就无法解决此代码.
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
Run Code Online (Sandbox Code Playgroud)
这就是它所说的:
4.13整数转换排名[conv.rank]
每个整数类型都有一个整数转换等级,定义如下:
- 任何无符号整数类型的等级应等于相应有符号整数类型的等级.
- char的等级应等于signed char和unsigned char的等级.
特别是,我的jimmies的沙沙声是它没有说任何无符号整数类型,只是unsigned char.我的猜测是,char通过转换被提升为无符号类型.这是真的?
c++ integer integer-promotion implicit-conversion unsigned-integer
我使用相同的参数列表重载操作符两次.但具有不同的返回类型:
T& operator()(par_list){blablabla}
const T& operator()(par_list){blablabla}
Run Code Online (Sandbox Code Playgroud)
所以当我调用()运算符时,将根据什么偏好或情况调用哪个函数?我知道如果我在const函数下调用()它必须是const T&one.
我只是好奇C++如何处理这种情况以及默认偏好如何工作.
谢谢
我有一个功能:
inline uint32_t ShiftOf(uint32_t v)
{
for (uint32_t s = 0; s < 32; ++s)
{
if (v == 1 << s)
return s;
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法优化它?
[...]命名构造函数的using声明不会创建同义词; 相反,如果在用于构造相应基类的对象时可以访问附加构造函数,则可以访问这些附加构造函数,并忽略using-declaration的可访问性.[...]
因此,以下代码无法编译:
class B { protected: B(int) { } };
class D: B { using B::B; };
int main () { D d{0}; }
Run Code Online (Sandbox Code Playgroud)
它返回的错误与所有主要编译器大致相同:
在这里宣布受保护
另一方面,以下代码编译:
class B { protected: B() { } };
class D: B { using B::B; };
int main () { D d{}; }
Run Code Online (Sandbox Code Playgroud)
它是否应该因为导致上一个示例中的错误的相同原因而无法编译?
它允许编译什么?
c++ default-constructor language-lawyer c++11 inherited-constructors
我在xp上安装了pyqt 4.8.1,在包中安装了Qt.我有一个标签
<object ...>
<param value='1.swf'>
<embed src='1.swf'></embed>
</param>
</object>
Run Code Online (Sandbox Code Playgroud)
但是Qt/webkit没有显示flash.(代码和IE或Chrome没有问题).Qt/webkit是否支持flash?
假设我有一个被称为foo继承自类的类bar.
我有一个std::unique_ptr实例,foo我想将它传递给一个只需要的函数std::unique_ptr<bar>.如何转换指针使其在我的函数中工作?
c ++中指向成员函数的指针分为三部分:
Offset
Address/index
virtual?
Run Code Online (Sandbox Code Playgroud)
当使用调用派生对象时,偏移用于指针调整 base pointer.
这个偏移是如何实现的?它是指向某个表的指针,每个派生类有一个表,该表是否包含表单的条目(base X, offset)?
另外,我在哪里可以获得更多关于此的信息?
当增加字符时,例如:char character{'a'};is 'a'和INT是97.当我说"人物+ 1"或"+ 1"我将获得整数值98没有'b'.现在,如果我做"++ character",我将获得char'b'.
char character{'a'};
cout << character + 1 << '\n';
cout << ++character << '\n';
Run Code Online (Sandbox Code Playgroud) 标题确实准确描述了我的要求。
extern "C" int foo( int bar ) { return bar; }
Run Code Online (Sandbox Code Playgroud)
从我一直在测试的内容来看,它似乎不是__cdecl, __stdcall, __fastcall,而且显然不是__thiscall。
什么是约定以及它如何运作?
谢谢。
似乎std::shared_ptr<T[]>(随 C++ 17 添加) 的明显用途是保存指向 的指针T,并delete[]在需要销毁托管对象时使用。但是这段代码:
#include <memory>
int main() {
std::shared_ptr<int[]> sp(new int[3]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
无法使用我尝试过的任何在线编译器进行编译。在所有情况下,错误消息都是以下内容的变体:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:3759:18:注意:候选模板被忽略:要求 'is_convertible<int *, int (*)[]>::value'不满足[_Yp = int]显式shared_ptr(_Yp* __p,
也就是说,采用指针的构造函数会得到 SFINAED ,因为指向元素类型的指针不可转换为指向数组的指针。这似乎是 C++ 17 标准和 C++ 20 中所要求的。
这真的是有意的吗?我该如何使用该构造函数?或者,如何创建一个std::shared_ptr在不显式指定删除器的情况下正确管理数组的对象?