c++ - 即使在 Visual C++ 编译器中,在模板中传递 "const char"参数时也会遇到一些问题 Nov 2013 CTP

标签 c++ templates parameter-passing

祝大家新年快乐,

即使在 Visual C++ 的最新版本编译器 2013 年 11 月 CTP 中,我在模板中传递“const char”参数时也遇到一些麻烦!这是一个简单的代码,在最新的 Visual C++ 编译器中不起作用,但在带有选项“std=c++x0”的“g++”中可以,

#include <stdlib.h>


template<char _parameterChar>
class A
{
    char varChar;
public:
    A(){ varChar = _parameterChar; }
    ~A(){}
};


int main(int argc, char* argv[])
{
    const char a_1 = 'a';
    const char a_2 = "abcdef"[0]; // This instruction gets a constant 'a'.


    A<'a'> first_A; // compile ok!
    A<a_1> second_A; // compile ok!
    A<a_2> third_A; // --->  This not compiles!! Why not ?!?!?!

    return 0;
}

Visual C++ 编译器给出该错误,

error C2971: 'A' : template parameter '_parameterChar' : 'a_2' : a local variable cannot be used as a non-type argument

我认为这是编译器的限制,因为“abcdef”[0],你可以在编译时得到 const char 'a',不是吗?

最佳答案

简单的答案是,标准规定 "abcdef"[0] 不是常量表达式。从逻辑上讲,编译器可能可以解决这个问题,但标准并未将其列入允许的操作中。表达式的求值涉及左值到右值的转换,并且只允许非常有限数量的左值到右值的转换。 (实际上,这在 C++11 中可能是合法的。但如果是这种情况,这将是一个新功能,并且可能不会被您的编译器实现。)

关于c++ - 即使在 Visual C++ 编译器中,在模板中传递 "const char"参数时也会遇到一些问题 Nov 2013 CTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20968026/

相关文章:

c++ - 调试断言失败表达式 : _pFirstBlock == pHead using OpenCV and C++ trying to call SurfFeatureDetector

php - 使用 Smarty 评论/跳过标记

python - 检查参数是否在不检查值的情况下传递给函数

php - 将参数从主线程传递到新线程

javascript - 将信息从源站点传递到 JavaScript 应用程序链接的安全方法?

c++ - 运算符+ 重载错误。无法返回对对象的引用

C++ 管理器对象和虚函数

c++ - 递归解决方案未按预期工作/遇到错误

azure - 如何安排部署ARM模板?

templates - 更改 ember.js 中的默认分隔符