2016-03-10 15 views
6

this test program Verilen:Neden bu "çağrı" sadece bir tanesi yerine iki argüman görmeyi iddia ediyor?

#include <cassert> 
#include <string> 
#include <type_traits> 

const std::string& const_string = "bla"; 
std::string const & string_const = "blabla"; 

static_assert(std::is_same<decltype(const_string), decltype(string_const)>::value, "Uhoh"); 

int main() 
{ 
    assert(std::is_same<decltype(const_string), decltype(string_const)>::value); 
} 

iki tip C'nin assert kullanarak derleme sırasında ve çalışma zamanında aynı olduğunu iddia Hangi. Clang, MSVC2015 ve GCC tümü aynı hatayı bildirmek, bu yüzden it's me eminim:

main.cpp:13:49: error: too many arguments provided to function-like macro invocation 
    assert(std::is_same<decltype(const_string), decltype(string_const)>::value); 
               ^
/usr/include/assert.h:91:10: note: macro 'assert' defined here 
# define assert(expr)             \ 
     ^

Sadece assert içinde iki argüman göremiyorum. Dahası, static_assert sadece iyi çalışıyor ... Peki burada neler oluyor?

+0

Önişlemcinin iki "karşılaştırmayı" gördüğüne inanıyorum; std :: is_same :: değer '. Önişlemcinin, olmadıklarını söylemesi için bir yolu yoktur. – molbdnilo

+1

** static_assert ** bir önişlemci makrosu ** bir ** anahtar kelimedir. Önişlemci makroları, akıllı olmayan bir şekilde ',' argümanlarını böler. Ek parantez bunu engeller. – Youka

cevap

3

Çünkü < ve > jeton var. Önişlemciyi mahvediyorlar. assert'un bir makro değil, bir işlev olduğunu unutmayın. Onlar',

assert((std::is_same<decltype(const_string), decltype(string_const)>::value)); 
    ^                ^
4

C tanımıyor C önişlemci ++ şablon sözdizimi, bu nedenle şablon parantez < ve > önişlemci tarafından belirteçleri gruplama olarak görülmelidir değildir:

bu (parantez sonuna fazladan ekleyin) Do basit karakterler olarak görülüyor.

Bu önişlemci böyle bir makro parametresi ayırıcı olarak şablon parametreleri arasında virgül görüntülemek anlamına gelir:

assert(
    std::is_same<decltype(const_string), 
    decltype(string_const)>::value); 

sadece assert sarın, tek bir ifade olarak ifadenizi görmek için önişlemci zorlamak için parantez oluşan ilave bir parametre: oldukça assert() gibi bir önişlemci makro yerine, C++ keyword çünkü

static_assert

assert((std::is_same<decltype(const_string), decltype(string_const)>::value)); 
bu sınırlama yoktur . Bu, C++ sözdizimini tam olarak desteklediği ve şablon parametrelerini doğru bir şekilde göreceği anlamına gelir.

İlgili konular