当涉及构造函数时,添加关键字会explicit阻止热情的编译器在不是程序员的第一个意图时创建对象.这种机制是否也适用于铸造操作员?
struct Foo
{
operator std::string() const;
};
Run Code Online (Sandbox Code Playgroud)
例如,在这里,我希望能够投入Foo到一个std::string,但我不希望这种投射是隐含的.
我可以要求用户按Enter使用read,并让他通过调用等sleep.但我想不出同时做两件事的方法.我希望用户可以选择:
按Ctrl+ C取消,Enter 继续或等待10秒
我怎样才能做到这一点?
双方unique_ptr并shared_ptr接受定制的析构函数他们所拥有的对象上调用.但在的情况下unique_ptr,析构函数作为一个模板参数传递类,而类型shared_ptr的自定义析构函数将被指定为一个模板参数的构造函数.
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
Run Code Online (Sandbox Code Playgroud)
和
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会有这样的差异.需要什么?
template<typename InputIterator, typename Predicate>
inline InputIterator
find_if(InputIterator first, InputIterator last, Predicate pred, input_iterator_tag)
{
while (first != last && !bool(pred(*first)))
++first;
return first;
}
Run Code Online (Sandbox Code Playgroud)
我在GCC 4.7.0附带的C++标准库的实现的源代码中遇到了这个片段.这是find_if输入迭代器的特化.我清理了前导下划线,使其更具可读性.
他们为什么bool在谓词上使用强制转换?
此 Google存储文档页面指出,You can use a CNAME redirect only with HTTP, not with HTTPS.但我看不出任何理由.谁能解释我为什么?
我试图使用OpenGL着色语言(GLSL)1.5版来制作顶点和几何着色器.
我已经了解到在GLSL 1.5版中,gl_ModelViewProjectionMatrix不推荐使用内置变量,所以你必须手动传递它们.如果我已经设置了模型视图和投影矩阵(使用gluLookAt和gluPerspective例如),那么如何让矩阵传递到顶点和几何着色器?我做了一些搜索,一些网站似乎提到了一个函数glGetMatrix(),但我在任何官方文档中找不到该函数,并且它似乎不存在于我正在使用的实现中(unknown identifier: glGetMatrix当我得到编译错误时)尝试用该函数编译它).
让我们考虑一下这段很短的代码片段:
#include <stdlib.h>
int main()
{
char* a = malloc(20000);
char* b = realloc(a, 5);
free(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在阅读了realloc的手册页后,我不完全确定第二行会导致释放19995个额外字节.引用手册页:The realloc() function changes the size of the memory block pointed to by ptr to size bytes.但是根据该定义,我可以确定其余的将被释放吗?
我的意思是,指向的块b肯定包含5个空闲字节,所以对于懒惰的顺从分配器是否足以让realloc行不做任何事情?
注意:我使用的分配器似乎释放了19 995个额外字节,如valgrind在注释掉free(b)行时所示:
==4457== HEAP SUMMARY:
==4457== in use at exit: 5 bytes in 1 blocks
==4457== total heap usage: 2 allocs, 1 frees, 20,005 bytes allocated
Run Code Online (Sandbox Code Playgroud) const char * foo()
{
return "abcdef";
}
int main()
{
printf("%s", foo());
}
Run Code Online (Sandbox Code Playgroud)
符合标准的编译器是否可以决定"abcdef"在堆栈上进行分配?即标准中的内容强制编译器在该.data部分中分配它?
struct Bar
{
Bar() {}
};
struct Foo
{
Foo() = default;
Bar m_bar;
};
int main()
{
Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
使用C++ 11 default关键字和gcc警告时-Weffc++,gcc输出:
警告:'Foo :: m_bar'应该在成员初始化列表中初始化[-Weffc ++]
忽略这个警告是否安全?我应该向gcc提交错误吗?
在Effective C++,第3项中,Scott Meyers建议重载operator*一个名为的类Rational:
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
Run Code Online (Sandbox Code Playgroud)
返回值被const限定的原因在下面的行中解释:如果不是const,程序员可以编写如下代码:
(a * b) = c;
Run Code Online (Sandbox Code Playgroud)
或者,更可能是:
if (a*b = c)
Run Code Online (Sandbox Code Playgroud)
很公平.现在我很困惑,因为我认为函数的返回值,这里是operator*,是一个rvalue,因此不能赋值.我认为它不是可转让的,因为如果我有:
int foo();
foo() += 3;
Run Code Online (Sandbox Code Playgroud)
那将无法编译invalid lvalue in assignment.为什么不在这里发生?有人可以对此有所了解吗?
编辑:我在Scott Meyers的那个项目上看到过很多其他线程,但是没有人解决我在这里暴露的rvalue问题.