C++标准是否保证(通过明确说明或通过逻辑推导隐式)std::uintmax_t可以保存所有值std::size_t?
或者是否可能std::numeric_limits<std::size_t>::max()大于std::numeric_limits<std::uintmax_t>::max()?
我用的是什么意思new auto?考虑一下表达式:
new auto(5)
Run Code Online (Sandbox Code Playgroud)
动态分配对象的类型是什么?它返回的指针的类型是什么?
我们可以通过将该对象的点T转换为a 来查看类型T*对象的表示char*.至少在实践中:
int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
std::cout << std::setw(2) << (int)cp[i] << ' ';
}
Run Code Online (Sandbox Code Playgroud)
这输出511我的系统的表示:ff 01 00 00.
(肯定)这里发生了一些实现定义的行为.哪个演员阵容允许我将一个转换int*为一个unsigned char*转换,哪个转换是否需要转换?我一投演就调用了未定义的行为?我可以投这样的任何T*类型吗?这样做我能依靠什么?
我读过的大多数关于面向对象编程的书都使用了Shape带有Shape.draw()成员函数的Dog类或带有成员函数的类Dog.talk()或类似的东西来演示多态的概念.现在,这对我来说是一个混乱的根源,这与多态性无关.
class Dog : public Animal
{
public:
...
virtual void talk() { cout << "bark! bark!" << endl; }
...
};
Run Code Online (Sandbox Code Playgroud)
虽然这可能只是一个简单的例子,但我无法想象一个好的方法可以让它在一个更复杂的应用程序中运行,其中Dog.talk()可能需要访问另一个类的声音子程序,例如玩bark.mp3而不是使用cout输出.比方说我有:
class Audio
{
public:
...
void playMP3(const string& filename)
...
};
Run Code Online (Sandbox Code Playgroud)
什么是Audio.playMP3()在设计时从Dog.talk()内部访问的好方法?做Audio.playMP3()静电?传递函数指针?已经Dog.talk()返回它想打,让程序处理它的另一部分文件名?
在C++ 14中,lambda表达式可以通过使用捕获初始化器从它们移动来捕获变量.但是,这会使得结果闭包对象不可复制.如果我有一个带有std::function参数的现有函数(我无法改变),我无法传递闭包对象,因为std::function构造函数需要给定的函子CopyConstructible.
#include <iostream>
#include <memory>
void doit(std::function<void()> f) {
f();
}
int main()
{
std::unique_ptr<int> p(new int(5));
doit([p = std::move(p)] () { std::cout << *p << std::endl; });
}
Run Code Online (Sandbox Code Playgroud)
这会出现以下错误:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/functional:1911:10: error:
call to implicitly-deleted copy constructor of '<lambda at test.cpp:10:7>'
new _Functor(*__source._M_access<_Functor*>());
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/functional:1946:8: note: in
instantiation of member function 'std::_Function_base::_Base_manager<<lambda at test.cpp:10:7>
>::_M_clone' requested here
_M_clone(__dest, __source, _Local_storage());
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/functional:2457:33: note: in
instantiation of member function 'std::_Function_base::_Base_manager<<lambda at test.cpp:10:7>
>::_M_manager' …Run Code Online (Sandbox Code Playgroud) 该标准似乎意味着如果变量的定义没有使用,则对变量的定义数量没有限制(§3.2/ 3):
每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义; 无需诊断.
它确实说任何变量都不能在翻译单元中多次定义(§3.2/ 1):
任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.
但我无法在整个程序中找到对非odr使用变量的限制.那么为什么我不能编译如下的东西:
// other.cpp
int x;
// main.cpp
int x;
int main() {}
Run Code Online (Sandbox Code Playgroud)
使用g ++ 4.6.3编译和链接这些文件时,我收到链接器错误multiple definition of 'x'.老实说,我期待这一点,但由于x在任何地方都没有使用过(据我所知),我看不出标准如何限制这一点.还是未定义的行为?
阿基于范围的for声明在§6.5.4定义为等同于:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
Run Code Online (Sandbox Code Playgroud)
其中range-init定义了两种基于范围的形式for:
for ( for-range-declaration : expression ) => ( expression )
for ( for-range-declaration : braced-init-list ) => braced-init-list
Run Code Online (Sandbox Code Playgroud)
(该条款进一步规定了其他子表达式的含义)
为什么__range给出推导类型auto&&?我的理解auto&&是,通过传递它来保留表达式的原始值(左值/右值)是有用的std::forward.但是,__range不会通过任何地方std::forward.它得到的范围内时迭代器作为一个人的只用__range,__range.begin()或begin(__range).
使用"通用参考"有auto&&什么好处?还auto&不够吗? …
我在尝试将我的网站连接到Facebook时遇到问题.我想要做的是允许用户通过将他们连接到Facebook来增加他们的帐户(我不需要人们能够使用Facebook登录,我使用的是OpenID).我的网站运行在CodeIgniter框架中.
我要做的就是删除我尝试过的所有内容,然后引导你完成我的步骤直到它停止工作.
第1步:设置JavaScript SDK和XFBML
首先,我将FBML规范的引用添加到我的<html>标记中:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml" xml:lang="en" lang="en">
Run Code Online (Sandbox Code Playgroud)
然后,在我的<body>标签之后,我添加:
<script src="http://static.new.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
现在我遇到了第一个问题但现在已经解决了.问题是JavaScript SDK的文档说该FB.init()方法需要appId作为参数,但结果证明这是不正确的.我需要通过我的apiKey.所以这是我最终得到的代码,它在我的</body>标记之前:
<div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({
apiKey : '<?php echo $this->config->item('facebook_api_key'); ?>',
status : true,
cookie : true,
xfbml : true
});
</script>
Run Code Online (Sandbox Code Playgroud)
现在我可以将XFBML实体添加到我的页面中,例如<fb:login-button></fb:login-button>它可以按预期工作.我点击它然后会弹出一个框,询问我是否允许我的网站访问我的Facebook个人资料.我说是的,然后如果我在Facebook上检查我的应用程序设置,我可以看到我的网站已被添加.
所以这一步很好.
第2步:设置PHP库
好的,现在我需要添加PHP库.因此,快速谷歌搜索'codeigniter facebook库'会显示Elliot Haughin的图书馆.我下载文件,将它们放在正确的位置,然后开始加载库.
现在出现了当前的问题.我将以下代码(取自库中给出的示例)添加到我的控制器构造函数中,以便它在每个页面上发生:
$this->load->library('facebook_connect');
$this->data['fb_user'] = $this->facebook_connect->user;
$this->data['fb_userid'] = $this->facebook_connect->user_id;
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,print_r($this->data['fb_user']);我什么也得不到.永远.我是否登录Facebook,登出,登录并将我的网站添加到我的个人资料等等.用户和user_id永远不会设置.我没有收到任何错误.
据我所知,应该设置这些值,以便我知道浏览我网站的人是否登录了他们的Facebook帐户.如果他们是,我可以看看他们是否允许我的申请.如果他们允许,我可以让他们与我的网站断开连接,如果没有,我可以让他们连接.但如果没有填充这些变量,我就无法做任何事情.
我试过在图书馆的内容中探索,但我真的无法理解它.而且我希望实际的解决方案不会涉及将图书馆分开.我希望CodeIgniter特定的库可以工作.
有任何想法吗?
非常感谢.:)
以下表达式通常用于演示未定义的未指定行为:
f() + g()
Run Code Online (Sandbox Code Playgroud)
如果f()和g()都有一些共享对象的副作用,则行为是不确定的不确定,因为执行的顺序是未知的.f()可以在之前评估,g()反之亦然.
现在我想知道当你在一个对象上链接成员函数时会发生什么.比方说,我有一个类,叫做实例的实例obj,它有两个成员函数,foo()而bar()这两个修改的对象.这些函数的执行顺序不是可交换的.在一个接一个之前调用一个的效果与用另一个方式调用它们的效果不同.这两个方法都返回一个引用,*this以便它们可以像这样链接:
obj.foo().bar()
Run Code Online (Sandbox Code Playgroud)
但这是不明确的行为吗?我在标准中找不到任何东西(不可否认只是扫描),区分了这个表达式和我在帖子顶部给出的表达.两个函数调用都是full-expression的子表达式,因此它们的执行顺序是未指定的.但肯定foo() 必须先评估,以便bar()知道要修改哪个对象.
也许我错过了一些明显的东西,但我无法看到序列点的创建位置.
在之前的回答中,我回答了以下警告是由于'\u0B95'需要三个字节的事实引起的,因此是一个多字符文字:
warning: multi-character character constant [-Wmultichar]
Run Code Online (Sandbox Code Playgroud)
但实际上,我不认为我是对的,我不认为gcc也是.标准规定:
包含多个c-char的普通字符文字是多字符文字.
c-char的一个生产规则是通用字符名称(即\uXXXX或\UXXXXXXXX).由于\u0B95是单个c-char,因此这不是多字符文字.但现在它变得凌乱.该标准还说:
包含单个c-char的普通字符文字具有类型
char,其值等于执行字符集中c-char的编码的数值.
所以我的文字具有char执行字符集中字符的类型和值(如果该集合中不存在,则为实现定义的值).char只被定义为足够大以存储基本字符集的任何成员(实际上不是由标准定义的,但我认为它意味着基本的执行字符集):
声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员.
因此,由于执行字符集是a char可以容纳的所有值的超集,因此我的角色可能不适合char.
那么什么样的价值确实我char有吗?这似乎没有在任何地方定义.该标准确实说,对于char16_t文字,如果该值不可表示,则该程序是不正确的.但它没有提及普通文字.
发生什么了?这只是一个标准的混乱还是我错过了什么?